I have a few TextBoxes that are bound to a single CheckBox.
This is the logic associated with it:
- If the
Checkboxis checked, it will overwrite any existing text in the associatedTextBoxesand make it ‘0’++ - If all of the
TextBoxeshave a score of ‘0,’ theCheckBoxshould
become disabled and checked. - If any of the
TextBoxesthen change from ‘0,’ it will become
enabled and unchecked.
++ *Note:* The caveat to this is if the TextBox has a value of ‘C.’
Okay, so the issue I have is implementing the caveat above when one of the associated TextBoxes has a value of ‘C.’ What I would like to have happen is loop through the TextBoxes and check to see if any are scored ‘C.’ If one is found, display a warning message to the user confirming if they want to proceed. If Yes is selected, all associated scores will be overwritten to ‘0.’ If No is selected then the Checked event should be cancelled.
To accomplish this, I added Event Listeners for the CheckBox.PreviewMouseDown and CheckBox.Checked events. Here is the code for my CheckBox.PreviewMouseDown event listener:
private void NormalCheckBoxControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
CheckBox normalCheckBox = (CheckBox)sender;
bool showCorrespondingScoreWarningMsg = false;
//Get a Row to loop through the AssociatedAdqScore controls for each
ScoreControl tempScoreControl = new ScoreControl();
foreach (ScoreControl score in this.ScoreControlList)
{
if (score.ScoreTextBox.Text == "C")
{
showCorrespondingScoreWarningMsg = true;
}
}
if (showCorrespondingScoreWarningMsg)
{
MessageBoxResult msgResult = InformationBox.Show("WARNING: Proceeding will remove corresponding 'C' scores. Continue?", "Continue?", ButtonStyle.YesNo, IconStyle.Question);
if (msgResult == MessageBoxResult.No)
{
e.Handled = true;
}
}
}
This works if the user selects ‘No,’ however the issue I’m having is that when choosing ‘Yes,’ the CheckBox.Checked event still does not get fired. I have tried to manually set CheckBox.IsChecked = true; if if (msgResult == MessageBoxResult.Yes), but this breaks the bindings so that is not a viable solution.
Is there any way I can resolve this issue and proceed with the NormalCheckBoxControl_Checked(object sender, RoutedEventArgs e) event if the user selects ‘Yes?’
I don’t know of a “Checked” event, though there is a
CheckedChangedevent and also aCheckStateChangedevent. I am used to .NET 2.0, so this may be a 3.0+ thing. Either way, I think I have manually called the event handler in instances like this without any problem.You can manually call the event handler with null params (or known object & new event args):
or
This should manually kick off your routine, and unless you need them, then there’s really no problem with providing dummy params. No need to raise an event and wait for it to bubble, just call the routine.
Of course, if there are other routines which rely on the event bubbling or if you have multiple handlers for the same event, then it might cause you a problem. Be aware of that, just in case.