我有一个包含两个文本框的表单:MultiStageCountValue,表示要选择的功能的数量,以及MultistagePercentageValue,它表示要选择的功能的百分比。
如果用户输入特征数量,隐藏代码将计算特征的百分比,更新 MultistagePercentageValue 文本框。如果用户输入要素百分比值,隐藏代码将更新 MultiStageCountValue 文本框的值。它还会重新计算实际百分比,因为它只允许在任一字段中输入整数(例如,76 个特征中的 33% 是 25 个特征,实际上是特征的 32.89%)。
这是 xaml 文件中每个文本框的代码。 MultiStageCountValue 文本框中的值用于使用绑定变量 MultistageCount 在 ViewModel 代码中进行查询。
<TextBox x:Name="MultistageCountValue"
Text="{Binding MultistageCount}"
PreviewTextInput="NumericTextBox_PreviewTextInput"
TextChanged="MultistageCountValue_TextChanged"/>
<TextBox x:Name="MultistagePercentageValue"
Text="{Binding MultistagePercentage}"
TextChanged="MultistageCountValue_TextChanged"
PreviewTextInput="NumericTextBox_PreviewTextInput"
LostFocus="MultistagePercentageValue_LostFocus"/>
两个文本框使用 TextChanged 事件的相同代码,这会在 MultiStageCountValue 文本框值更改时执行一些验证并更新 MultistagePercentageValue 文本框。
private void MultistageCountValue_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textbox = sender as TextBox;
if (textbox.Name == "MultistageCountValue")
{
MultistagePercentageValue.Text = ((double)int.Parse(textbox.Text) / NumberofFeatures * 100).ToString("F");
}
// other validation code
}
这是 MultistagePercentageValue 文本框失去焦点时的代码,以便 MultiStageCountValue 文本框仅在用户输入百分比后才会更新
private void MultistagePercentageValue_LostFocus(object sender, RoutedEventArgs e)
{
TextBox textbox = sender as TextBox;
MultistageCountValue.Text = (float.Parse(textbox.Text) / 100 * NumberofFeatures).ToString("F0");
}
在我的测试中,如果我在 MultiStageCountValue 文本框中键入,或者在 MultistagePercentageValue 文本框中键入,然后单击 MultiStageCountValue 文本框,则 MultistageCount 值会正确更新。
但是,如果我输入 MultistagePercentageValue 文本框并按 Tab 键退出,虽然 MultiStageCountValue 文本框将更新,但 MultistageCount 值不会更新,并且查询将使用以前的值。
当通过按 Tab 键移出文本框而不是单击文本框外部而失去焦点时,为什么 MultistageCount 不会更新?
我必须指定 UpdateTrigger 属性。 Text 属性默认为 LostFocus,因此当我将其更改为 PropertyChanged 时,它会按预期工作。
<TextBox x:Name="MultistageCountValue"
Text="{Binding MultistageCount, UpdateSourceTrigger=PropertyChanged}"
PreviewTextInput="NumericTextBox_PreviewTextInput"
TextChanged="MultistageCountValue_TextChanged"/>