【问题标题】:Xamarin.Forms - Picker selected Item binding not respondingXamarin.Forms - 选择器选择的项目绑定没有响应
【发布时间】:2018-02-21 17:34:34
【问题描述】:

我正在使用 xamarin.forms 中的 picker 字段进行简单的 mvvm 绑定。我正在关注本指南xamarin guide setting a picker's bindings

于是我做了一个模型:

public class Operation
{
    public int Number { get; set; }
    public string Name { get; set; }
}

一个视图模型:

private List<Operation> _operations;
public List<Operation> Operations
{
    get { return _operations; }
    set
    {
        _operations = value;
        OnPropertyChanged();
    }
}

和视图:

<Picker 
    ItemsSource="{Binding Operations}"
    ItemDisplayBinding="{Binding Number}"
    SelectedItem = "{Binding SelectedOperation}"/>
<Entry x:Name="HelpEntry"
       Text="{Binding SelectedOperation.Name}" />

在 Pickers 列表中项目显示正确,但是当我选择项目编号时,不显示条目内的绑定。

怀疑是,我做错了什么?


顺便说一句.. 我这样做是因为我需要通过使用 HelpEntry.Text 在我的代码隐藏部分中获得一个选定的 Operation's Name 作为变量。这不是最聪明的方法,你有更好的主意吗?

任何帮助将不胜感激。

【问题讨论】:

  • 首先使用ObservableCollection 而不是ListSelectedOperation的setter是否调用OnPropertyChange方法?
  • .. 我什至没有在视图模型中创建变量。现在一切正常。这将被接受的答案。谢谢亚历克斯!

标签: c# xamarin mvvm binding xamarin.forms


【解决方案1】:

您的 ViewModel 还应包含 SelectedOperation 属性,该属性还应在其设置器中调用 OnPropertyChanged 方法。

您还应该考虑在视图模型中使用ObservableCollection 而不是List

【讨论】:

  • ObservableCollection 如果只有 1 次绑定,则不需要。如果您在第一次绑定后更改列表,则应该只使用 ObservableCollection
  • @batmaci 确实是这样,我没说他一定要用ObservableCollection
【解决方案2】:

确保您的 ViewModel 实现了 INotifyPropertyChanged 接口。轻松做到这一点的方法是创建一个实现接口的 BaseViewModel,然后从这个基类继承所有具体的视图模型类。

 public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class MainPageVM : ViewModelBase
{...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多