【问题标题】:How to disable ListView selection change when item has changes in MVVM/MVW?当项目在 MVVM/MVW 中发生更改时,如何禁用 ListView 选择更改?
【发布时间】:2018-07-14 19:22:09
【问题描述】:

我有简单的视图模型:

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:

<ListView 
    ItemsSource="{Binding ItemsList}" 
    SelectedItem="{Binding SelectedItem}" 
/>

很少有带有 Item 属性的控件:

<TextBox Text="{Binding SelectedItem.Name}"/>
<TextBox Text="{Binding SelectedItem.Phone}"/>

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

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

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

public bool NoUnsavedChanges
{
    get { return !context.ChangeTracker.HasChanges(); }
    private set;
}

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

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

【问题讨论】:

    标签: c# wpf mvvm entity-framework-6 mvw


    【解决方案1】:

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

    然后引发PropertyChanged 事件。您的视图模型应该实现INotifyPropertyChanged 事件,您的Item 类也应该实现。如果不是,你应该用一个包装类替换它。然后,只要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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多