C# 当项目在MVVM/MVW中发生更改时,如何禁用ListView选择更改?

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

我有一个简单的viewmodel:

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");
}