C# 在ViewModel中实现iNotifypropertychanged后,SelectedItem不在listview上工作
您好,我正在Xamarin表单中使用MVVM。我正在尝试将Listview的SeletedItem绑定到ViewModel。我把它装订好了,效果很好。但当我实现INotifyPropertyChanged以更新其他组件的视图时,它停止工作 即使在我的ViewModel中实现了INotifyPropertyChanged,我也希望它能够工作。我正在弄清楚它为什么会发生的问题。我在网上和Xamarin的文档中搜索,找不到原因 我的看法 希望得到一些有用的建议。将您的SelectedPerson属性更改为call on property Changed 更改SelectedPerson属性以调用PropertyChangedC# 在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属性更
您的设置程序都没有调用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();
}
}
}