我有以下XAML標記:WPF組合框綁定行爲
<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公共屬性視圖模型。 Customer對象包含Product類型的FavouriteProduct屬性,Product對象包含公共屬性ProductNumber和ProductName。
我正在尋找的行爲是讓組合框的SelectedItem更新文本框中的文本,反之亦然。 ComboBox到TextBox工作得很好。選擇ComboBox中的任何產品都會使用該產品的產品編號更新文本框。但是,當我嘗試以另一種方式時,我會得到一些奇怪的行爲。它僅適用於所選項目之前的項目。我會盡量解釋:
考慮產品下面的列表([產品型號],[產品名稱]):
- 芬達
- 百事可樂
- 可口可樂
- 雪碧
- 水
現在讓我們來說說SelectedCustomer的favouri te產品是可口可樂(必須是開發商)。所以當窗口打開時,TextBox讀取3,ComboBox讀取可口可樂。可愛。現在讓我們將TextBox中的產品編號更改爲2.ComboBox將其更新爲百事可樂的價值。現在嘗試將文本框中的產品編號更改爲高於可口可樂(Coca Cola)(3)的編號。不太可愛。選擇4(Sprite)或5(Water)使ComboBox恢復到可口可樂。因此,行爲似乎是從ItemSource中的列表中打開窗口寬度的項目下面的任何內容都不起作用。將其設置爲1(芬達),其他人均無效。設置爲5(水),他們都工作。這可能與ComboBox的一些初始化有關嗎?潛在的錯誤?好奇是否有其他人看到過這種行爲。
UPDATE:爲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");
}
}
錯誤在我身上...我用正確的代碼更新了我的答案。 – 2009-10-07 12:37:50
爲了確保當屬性沒有真正改變時不會觸發已更改的事件,請使用'if(_selectedProduct!= value){/*...*/}'塊。 – 2009-10-08 23:31:31
您的新解決方案是完全有效的(實際上它避免重複的信息很棒)。然而,我感到奇怪的是你仍然收到堆棧溢出。我把代碼放入VS,對我來說運行得很好。不知道你身邊出了什麼問題。您對選定的顧客進行的更改是否也促使更新其他兩個屬性?無論哪種方式,我已更新我的示例代碼與在我的機器(TM) – 2009-10-09 20:36:24