我可以将一个wpf控件绑定到两个源吗?

我可以将一个wpf控件绑定到两个源吗?,wpf,binding,Wpf,Binding,基本上,我有两个文本框,它们绑定到列表视图的两列。当用户在列表视图中选择一行时,这些值将显示在文本框中。这没有问题 用户可以编辑一个文本框,另一个文本框不可编辑。第二个文本框的文本基于第一个文本框的文本。例如,第一个框是以人民币表示的产品价格,第二个框是以英镑表示的产品价格。汇率从设定值开始。用户只能编辑人民币的价值,但不能编辑英镑的价值。销售价格最初来自数据库 我的目的是当用户更改第一个TextBox时,然后在text\u changed事件中,我计算第二个TextBox的值 当最终用户将所选

基本上,我有两个文本框,它们绑定到
列表视图的两列。当用户在
列表视图中选择一行时,这些值将显示在文本框中。这没有问题

用户可以编辑一个
文本框
,另一个
文本框
不可编辑。第二个
文本框的文本基于第一个
文本框的文本。例如,第一个框是以人民币表示的产品价格,第二个框是以英镑表示的产品价格。汇率从设定值开始。用户只能编辑人民币的价值,但不能编辑英镑的价值。销售价格最初来自数据库

我的目的是当用户更改第一个
TextBox
时,然后在text\u changed事件中,我计算第二个
TextBox
的值

当最终用户将所选内容更改为
列表视图时
,在我看来,绑定到GoodsSoldPriceCN似乎是首先发生的,然后触发了文本更改事件。在事件处理程序中,我计算第二个
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}" />

我使用Binding.SourceUpdated event而不是TextChanged event,这就解决了问题。

您可以通过创建附加属性来实现这一点。您能告诉我更多的细节吗?在哪个类中创建附加属性?
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());
        }          
    }
 ...
}