C# 当项目在MVVM/MVW中发生更改时,如何禁用ListView选择更改?
我有一个简单的viewmodel:C# 当项目在MVVM/MVW中发生更改时,如何禁用ListView选择更改?,c#,wpf,mvvm,entity-framework-6,mvw,C#,Wpf,Mvvm,Entity Framework 6,Mvw,我有一个简单的viewmodel: private List<Item> itemsList; public List<Item> ItemsList { get { return itemsList; } set { itemsList= value; NotifyPropertyChanged(); } } private Item selectedItem; public Item SelectedI
private List<Item> itemsList;
public List<Item> ItemsList
{
get { return itemsList; }
set
{
itemsList= value;
NotifyPropertyChanged();
}
}
private Item selectedItem;
public Item SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged();
}
}
// I call this method from button handler
// window code behind: vm.SaveChanges()
// instead of RelayCommand because I'm lazy (I don't need strict MVVM)
public void SaveChanges()
{
context.SaveChanges();
}
并将其绑定到ListView的IsEnabled属性,但它当然不起作用,因为此属性没有NotifyPropertyChanged()
我的问题是:当选定项时(或者如果整个上下文中有未保存的更改),如何禁用ListView选择更改(或完全禁用)
…并将其绑定到ListView的IsEnabled属性,但它当然不起作用,因为此属性没有NotifyPropertyChanged(
)
然后引发PropertyChanged
事件。视图模型应该实现INotifyPropertyChanged
事件,您的项
类也应该实现该事件。如果没有,您应该用一个包装类替换它。然后,只要SelectedItem
的状态发生更改,您就可以为视图模型的NoUnsavedChanges
属性引发PropertyChanged
事件,例如:
private List<Item> itemsList;
public List<Item> ItemsList
{
get { return itemsList; }
set
{
itemsList = value;
NotifyPropertyChanged();
}
}
private Item selectedItem;
public Item SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem != null)
selectedIten.PropertyChanged -= OnItemPropertyChanged;
selectedItem = value;
NotifyPropertyChanged();
if (selectedItem != null)
selectedIten.PropertyChanged += OnItemPropertyChanged;
}
}
private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged("NoUnsavedChanges");
}
public bool NoUnsavedChanges
{
get { return !context.ChangeTracker.HasChanges(); }
}
public void SaveChanges()
{
context.SaveChanges();
NotifyPropertyChanged("NoUnsavedChanges");
}
私有列表项列表;
公共列表项目列表
{
获取{return itemsList;}
设置
{
itemsList=值;
NotifyPropertyChanged();
}
}
私有项目selectedItem;
公共项目选择项
{
获取{return selectedItem;}
设置
{
如果(selectedItem!=null)
选择editen.PropertyChanged-=OnItemPropertyChanged;
选择editem=值;
NotifyPropertyChanged();
如果(selectedItem!=null)
选择editen.PropertyChanged+=OnItemPropertyChanged;
}
}
私有void OnItemPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
NotifyPropertyChanged(“nounonSavedChanges”);
}
公共布尔名词保存更改
{
获取{return!context.ChangeTracker.HasChanges();}
}
公共void SaveChanges()
{
SaveChanges();
NotifyPropertyChanged(“nounonSavedChanges”);
}
<TextBox Text="{Binding SelectedItem.Name}"/>
<TextBox Text="{Binding SelectedItem.Phone}"/>
public bool NoUnsavedChanges
{
get { return !context.ChangeTracker.HasChanges(); }
private set;
}
private List<Item> itemsList;
public List<Item> ItemsList
{
get { return itemsList; }
set
{
itemsList = value;
NotifyPropertyChanged();
}
}
private Item selectedItem;
public Item SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem != null)
selectedIten.PropertyChanged -= OnItemPropertyChanged;
selectedItem = value;
NotifyPropertyChanged();
if (selectedItem != null)
selectedIten.PropertyChanged += OnItemPropertyChanged;
}
}
private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged("NoUnsavedChanges");
}
public bool NoUnsavedChanges
{
get { return !context.ChangeTracker.HasChanges(); }
}
public void SaveChanges()
{
context.SaveChanges();
NotifyPropertyChanged("NoUnsavedChanges");
}