首页 > 解决方案 > 在 ViewModel 中实施 iNotifypropertychanged 后 SelectedItem 不能在列表视图上工作

问题描述

您好我在 Xamarin Forms 中使用 MVVM。我正在尝试将我的 Listview 的 SelectedItem 绑定到我的 ViewModel。我绑定了它并且工作正常。但是当我实现 INotifyPropertyChanged 来更新其他一些组件的视图时,它停止工作。

即使在我的 ViewModel 中实现了 INotifyPropertyChanged,我也希望它能够工作。我正在弄清楚它为什么会发生的问题。我在互联网和 Xamarin 的文档上进行了搜索,但找不到原因。

我的观点

<ListView ItemsSource="{Binding PersonsList}"
          CachingStrategy="RecycleElement"
          HasUnevenRows="True"
          SelectionMode="None"
          SelectedItem="{Binding SelectedPerson}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="5">
                        <Label Text="{Binding FullName}" 
                           FontSize="Medium" 
                           TextColor="Orange"/>

                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

视图模型

 public class PersonViewModel : INotifyPropertyChanged
{
    public PersonViewModel()
    {
        PersonsList = new ObservableCollection<User>
        {
            new User(){ UserId = 1, FullName = "John" },
            new User(){ UserId = 2, FullName = "Alex" },
            new User(){ UserId = 3, FullName = "Ellen" },
            new User(){ UserId = 4, FullName = "Grace" }
        };
    }
    public ObservableCollection<User> PersonsList { get; set; }

    private User _selectedPerson { get; set; }
    public User SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            if (_selectedPerson != value)
            {
                _selectedPerson = value;
               OnPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

模型

public class User
{
    public int UserId { get; set; }
    public string FullName { get; set; }
}

希望能得到一些有用的建议。

标签: c#.netxamarinmvvmxamarin.forms

解决方案


将您的属性更改SelectedPerson为 call OnPropertyChanged()

private User _selectedPerson { get; set; }
public User SelectedPerson
{
    get { return _selectedPerson; }
    set
    {
        if (_selectedPerson != value)
        {
            _selectedPerson = value;
            OnPropertyChanged();
        }
    }
}

推荐阅读