簡體   English   中英

XAML 中使用 Lambda 表達式和 MVVM 模式的 OneWay/TwoWay 綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM