文本框中的数据绑定不一致更新

问题描述 投票:0回答:1

我有一个包含两个文本框的表单:MultiStageCountValue,表示要选择的功能的数量,以及MultistagePercentageValue,它表示要选择的功能的百分比。

enter image description here

如果用户输入特征数量,隐藏代码将计算特征的百分比,更新 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 不会更新?

c# xaml data-binding
1个回答
0
投票

我必须指定 UpdateTrigger 属性。 Text 属性默认为 LostFocus,因此当我将其更改为 PropertyChanged 时,它会按预期工作。

<TextBox x:Name="MultistageCountValue" 
  Text="{Binding MultistageCount, UpdateSourceTrigger=PropertyChanged}"
  PreviewTextInput="NumericTextBox_PreviewTextInput"
  TextChanged="MultistageCountValue_TextChanged"/>
© www.soinside.com 2019 - 2024. All rights reserved.