基本上我有两个文本框,它们绑定到 a 的两列ListView
。当用户在 中选择一行时ListView
,值将显示在文本框中。这没有问题。
用户可以编辑其中一个的文本,TextBox
另一个TextBox
不可编辑。第二个的文本TextBox
是基于第一个的文本TextBox
。例如,第一个框是人民币的产品价格,第二个框是英镑的产品价格。汇率来自设置。用户只能编辑人民币的价值,不能编辑英镑。售价最初来自数据库。
我的目的是当用户更改第一个TextBox
,然后在 text_changed 事件中,我计算第二个的值TextBox
。
当最终用户将选择更改为 时ListView
,在我看来,与 GoodsSoldPriceCN 的绑定首先发生,然后触发了 text_changed 事件。在事件处理程序中,我计算第二个以英镑为单位的售价,TextBox
这种双向绑定将更新源。问题是这不会更新用户刚刚选择的行,而是更新用户之前选择的行。
所以,我的问题是我怎样才能达到这个要求。
两个文本框绑定到 a 的一行的选择ListView
。当用户手动更改第一个文本框的文本时,第二个文本框也会绑定到第一个文本框的文本TextBox
。
我的代码如下:
XAML
<TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Stretch" Name="GoodsSoldPriceCN" Style="{StaticResource textBoxInError}" TextChanged="GoodsSoldPriceCN_TextChanged">
<TextBox.Text>
<Binding Path="soldpricecn" ConverterCulture="zh-cn">
<Binding.ValidationRules>
<ValidationRules:MoneyValueRule Min="1" Max="100000"></ValidationRules:MoneyValueRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox Grid.Row="3" Grid.Column="1" HorizontalAlignment="Stretch" Name="GoodsSoldPriceGB" IsEnabled="False" Style="{StaticResource textBoxInError}" Text="{Binding Path=soldpricegb, Converter={StaticResource MoneyValueConverter}, UpdateSourceTrigger=PropertyChanged, ConverterCulture=en-gb}" />
Code
private void GoodsSoldPriceCN_TextChanged(object sender, TextChangedEventArgs e)
{
isDirtyOrder = true;
ListViewItem item = e.OriginalSource as ListViewItem;
try
{
if (!String.IsNullOrEmpty(GoodsSoldPriceCN.Text))
GoodsSoldPriceGB.Text =
(decimal.Parse(GoodsSoldPriceCN.Text) / decimal.Parse (Properties.Settings.Default.ExchangeRate)).ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
...
}