<TextBox x:Name="MyTextBox" Text="{Binding Path=SelectedCustomer.FavouriteProduct.ProductNumber, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox x:Name="MyComboBox" ItemsSource="{Binding Products}" DisplayMemberPath="ProductName"
SelectedValue="{Binding Path=SelectedCustomer.FavouriteProduct.ProductNumber}"
SelectedValuePath="ProductNumber" />
我的视图DataContext绑定到一个包含名为SelectedCustomer的公共属性的视图模型。客户对象包含类型为Product的FavouriteProduct属性,而Product对象包含公共属性ProductNumber和ProductName。
我要实现的行为是使ComboBox的SelectedItem更新TextBox的文本,反之亦然。ComboBox到TextBox的更新效果很好。选择ComboBox中的任何产品都会将该产品的产品编号更新到TextBox中。然而,当我尝试从另一个方向进行时,我得到了一些奇怪的行为。它只适用于所选项目之前的项目。我将尝试解释:
考虑以下产品清单([产品编号],[产品名称]):
- 芬达
- 百事可乐
- 可口可乐
- 雪碧
- 水
更新:
阅读了Mike Brown的回答后,我为SelectedProduct和SelectedProductNumber创建了属性。我遇到的问题是,一旦您从ComboBox中选择了某个内容,就会陷入无限循环,其中属性会不断更新彼此。我是否未正确实现OnPropertyChanged处理程序或是否有什么我错过的东西?这是来自我的ViewModel的代码片段:
private int _SelectedProductNumber = -1;
public int SelectedProductNumber
{
get
{
if (_SelectedProductNumber == -1 && SelectedCustomer.Product != null)
_SelectedProductNumber = SelectedCustomer.Product.ProductNumber;
return _SelectedProductNumber;
}
set
{
_SelectedProductNumber = value;
OnPropertyChanged("SelectedProductNumber");
_SelectedProduct = ProductList.FirstOrDefault(s => s.ProductNumber == value);
}
}
private Product _SelectedProduct;
public Product SelectedProduct
{
get
{
if (_SelectedProduct == null)
_SelectedProduct = SelectedCustomer.Product;
return _SelectedProduct;
}
set
{
_SelectedProduct = value;
OnPropertyChanged("SelectedProduct");
_SelectedProductNumber = value.ProductNumber;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
更新2
我现在稍微改变了实现方式,通过更新SelectedCustomer.FavouriteProduct的两个属性,然后在读取它们的值时使用它。现在这个方法可以工作了,但我不确定这是否是“正确的方法”。
private int _SelectedProductNumber = 0;
public int SelectedProductNumber
{
get
{
if (SelectedCustomer.Product != null)
_SelectedProductNumber = SelectedCustomer.Product.ProductNumber;
return _SelectedProductNumber;
}
set
{
_SelectedProductNumber = value;
SelectedCustomer.FavouriteProduct = ProductList.FirstOrDefault(s => s.ProductNumber == value);
OnPropertyChanged("SelectedProductNumber");
OnPropertyChanged("SelectedProduct");
}
}
private Product _SelectedProduct;
public Product SelectedProduct
{
get
{
if (SelectedCustomer.Product != null)
_SelectedProduct = SelectedCustomer.Product;
return _SelectedProduct;
}
set
{
_SelectedProduct = value;
SelectedCustomer.FavouriteProduct = value;
OnPropertyChanged("SelectedProduct");
OnPropertyChanged("SelectedProductNumber");
}
}
if (_selectedProduct != value) { /*...*/ }
代码块。 - Brett Ryan