首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当项目在MVVM/MVW中发生更改时,如何禁用ListView选择更改?

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

Stack Overflow用户
提问于 2018-07-14 19:22:09
回答 1查看 804关注 0票数 0

我有一个简单的视图模型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<ListView 
    ItemsSource="{Binding ItemsList}" 
    SelectedItem="{Binding SelectedItem}" 
/>

并且很少有具有项属性的控件:

代码语言:javascript
复制
<TextBox Text="{Binding SelectedItem.Name}"/>
<TextBox Text="{Binding SelectedItem.Phone}"/>

当我在ListView - SelectedItem字段值上选择一个出现在TextBoxes中的项时,我可以编辑它们并保存它们。一切正常,但我不想让用户在保存更改之前更改所选的项,因为用户不会看到在另一项中更改了什么。

现在我想禁用ListView上的选择更改,当项未保存更改时。

我正在试验这样的ViewModel属性:

代码语言:javascript
复制
public bool NoUnsavedChanges
{
    get { return !context.ChangeTracker.HasChanges(); }
    private set;
}

并将其绑定到ListView的ListView属性,但当然不能工作,因为该属性没有NotifyPropertyChanged()。

我的问题是:当选定的项(或者如果整个上下文中有未保存的更改)时,如何禁用ListView选择更改(或完全禁用它)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 10:08:44

...and将其绑定到ListView的IsEnabled属性,但它当然不能工作,因为该属性没有NotifyPropertyChanged()。

然后引发一个PropertyChanged事件。视图模型应该实现INotifyPropertyChanged事件,Item类也应该实现。如果没有,您应该用一个包装类替换它。然后,当视图模型的状态发生变化时,您可以为视图模型的PropertyChanged属性引发SelectedItem事件,例如:

代码语言:javascript
复制
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");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51342668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档