C# 在ViewModel中实现iNotifypropertychanged后,SelectedItem不在listview上工作

C# 在ViewModel中实现iNotifypropertychanged后,SelectedItem不在listview上工作,c#,.net,xamarin,mvvm,xamarin.forms,C#,.net,Xamarin,Mvvm,Xamarin.forms,您好,我正在Xamarin表单中使用MVVM。我正在尝试将Listview的SeletedItem绑定到ViewModel。我把它装订好了,效果很好。但当我实现INotifyPropertyChanged以更新其他组件的视图时,它停止工作 即使在我的ViewModel中实现了INotifyPropertyChanged,我也希望它能够工作。我正在弄清楚它为什么会发生的问题。我在网上和Xamarin的文档中搜索,找不到原因 我的看法 希望得到一些有用的建议。将您的SelectedPerson属性更

您好,我正在Xamarin表单中使用MVVM。我正在尝试将Listview的SeletedItem绑定到ViewModel。我把它装订好了,效果很好。但当我实现INotifyPropertyChanged以更新其他组件的视图时,它停止工作

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

我的看法

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

将您的SelectedPerson属性更改为call on property Changed

更改SelectedPerson属性以调用PropertyChanged


您的设置程序都没有调用PropertyChanged,因此您没有真正使用INPC。我更新了我的问题。我已经添加了属性更改,但它仍然检测不到所选项目。您的任何设置程序都没有调用PropertyChanged,因此您没有真正使用INPC。我更新了我的问题。我已经添加了属性更改,但仍然没有检测到所选项目。我更新了我的问题。我已添加属性更改,但它仍然检测不到所选项目。请尝试显式将SelectionMode设置为Single。另外,钩住ItemTapped和“ItemSelected”,以确保ListView实际上正在注册选择。您在选择项目时是否看到任何UI更改?感谢@ottermatic,它正在将SelectionMode设置为single,但它得到了一种选择颜色。我知道一种添加自定义渲染以移除的方法。这是摆脱它的一种方法吗。我使用SelectionMode的原因是此选择颜色。没有简单的方法可以删除或更改选择颜色。您需要使用自定义渲染器,或者对于android,您需要在样式中设置所有这些。xml:@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected您可以看到,我对大多数样式使用相同的颜色。您还可以立即将SelectedItem设置为null,以立即删除突出显示。我更新了我的问题。我已添加属性更改,但它仍然检测不到所选项目。请尝试显式将SelectionMode设置为Single。另外,钩住ItemTapped和“ItemSelected”,以确保ListView实际上正在注册选择。您在选择项目时是否看到任何UI更改?感谢@ottermatic,它正在将SelectionMode设置为single,但它得到了一种选择颜色。我知道一种添加自定义渲染以移除的方法。这是摆脱它的一种方法吗。我使用SelectionMode的原因是此选择颜色。没有简单的方法可以删除或更改选择颜色。您需要使用自定义渲染器,或者对于android,您需要在样式中设置所有这些。xml:@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected@color/ListViewSelected您可以看到,我对大多数样式使用相同的颜色。您还可以立即将SelectedItem设置为null,以立即删除突出显示。
<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; }
}
private User _selectedPerson { get; set; }
public User SelectedPerson
{
    get { return _selectedPerson; }
    set
    {
        if (_selectedPerson != value)
        {
            _selectedPerson = value;
            OnPropertyChanged();
        }
    }
}