[英]OneWay/TwoWay binding in XAML using Lambda expression and MVVM pattern
我無法使用帶有lambda
表達式的MVVM
模式在我的ViewModel
綁定XAML
中的Combobox.SelectedItem
。
在我的MainWindow.xaml
我有:
<ComboBox ItemsSource="{Binding Products}" IsEnabled="{Binding ProductsIsEnabled}" SelectedItem="{Binding SelectedProduct}" />
在我的MainWindow.xaml.cs
我正確設置了DataContext
(我在xaml
所有其他代碼都可以正常工作)。
在我的MainWindowViewModel.cs
我有:
...
public string TitleText => Title.Text;
...
public ObservableCollection<object> Products => MyConverter.GetCollection(ProductList);
public bool ProductsIsEnabled => MyProduct.IsEnabled;
public object SelectedProduct => ProductList.SelectedItem; // --> this does not work
...
我在運行時收到的錯誤是
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll
A TwoWay or OneWayToSource binding cannot work on the read-only property 'SelectedProduct' of type 'MyNamespace.MainWindowViewModel'.
我所有的對象都實現INotifyPropertyChanged
。 有人知道我在這里遺漏了什么或做錯了什么嗎?
提前致謝!
public object SelectedProduct => ProductList.SelectedItem;
是一個簡短的形式
public object SelectedProduct
{
get
{
return ProductList.SelectedItem;
}
}
這意味着帶有 lambda 表達式的屬性是沒有 setter 的屬性; 它是只讀屬性。 用戶可以更改組合框的SelectedItem
,即用戶可以更改SelectedProduct
屬性的值。
要修復它,您必須使用屬性的 setter,或者您必須以兩種方式更改綁定:
<ComboBox ItemsSource="{Binding Products}" IsEnabled="{Binding ProductsIsEnabled}" SelectedItem="{Binding SelectedProduct, Mode=OneWay}" />
單向綁定意味着如果用戶更改該屬性,則該屬性保持不變。 僅當您更改屬性時,UI 元素才會更改。
附錄:在我閱讀您的評論后:您的屬性ProductList.SelectedItem
可以有一個 getter 和一個 setter,但這並不意味着您的屬性SelectedProduct
將有一個 setter 和一個 getter。 將其更改為
public object SelectedProduct
{
get
{
return ProductList.SelectedItem;
}
set
{
ProductList.SelectedItem = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedProduct)));
}
}
它應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.