繁体   English   中英

WPF中的嵌套视图模型

[英]Nested view model in WPF

仍然尝试在此处学习MVVM和WPF。

我正在尝试创建一个复杂的视图模型EditArticleViewModel 它有一些针对相似控件重复的代码,因此我将重复的代码移到了另一个类中。 然后,我将另一个类的几个实例添加到EditArticleViewModel

我将把EditArticleViewModel的实例设置为窗口的DataContext 我将绑定到Categories.ItemsSubcategories.SelectedItem类的东西。

public class CategoryView
{
    public ObservableCollection<object> Items { /* */ }
    public object SelectedItem { /* ... */ }
}

public class SubcategoryView
{
    public ObservableCollection<object> Items { /* */ }
    public object SelectedItem { /* ... */ }
}

public class EditArticleViewModel : INotifyPropertyChanged
{
    public CategoryView Categories { get; private set; }
    public SubcategoryView Subcategories { get; private set; }

    public EditArticleViewModel()
    {
        Categories = new CategoryView();
        SubcategoryView Subcategories new SubcategoryView();
    }

    // Additional properties and methods here

}

如您所见,我的EditArticleViewModel类实现了INotifyPropertyChanged以便在发生更改时可以通知可视元素。

我的问题是关于如何通知视觉元素有关CategoryViewSubcategoryView更改的信息。 有没有一种方法可以直接向窗口通知这些类中的更改? 还是我必须从每个类中引发一个事件并让EditArticleViewModel处理该事件才能发送适当的通知?

任何提示表示赞赏。

每个视图只能有一个ViewModel,并且扩展方式是主ViewModel可以包含其他“ ViewModel”。

因此,当您将DataContext设置为主ViewModel时,其所有内容将具有对NotifyPropertyChanged事件的订阅,因此将通知在其他派生的ViewModel中实现INotifyPropertyChanged接口。

我建议使用INotifyPropertyChanged interface实现基类,您可以从其他ViewModel中派生该interface

通过进行此更改,您应该解决您遇到的问题:

public class ObservableViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName]string propName = null)
    {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}

public class CategoryView : ObservableViewModelBase
{
  public ObservableCollection<object> Items { /* */ }
  public object SelectedItem { /* ... */ }
}

public class SubcategoryView : ObservableViewModelBase
{
  public ObservableCollection<object> Items { /* */ }
  public object SelectedItem { /* ... */ }
}

public class EditArticleView : ObservableViewModelBase
{
  public CategoryView Categories { get; set; } = new CategoryView();
  public SubcategoryView Subcategories { get; set; } = new SubcategoryView();
}

关于ObservableCollection 仅当您添加/删除项目时,它才会通知视图更改,但是当内容更改时,它不会通知。 要更新有关项目内容更改的视图,您应该具有以下内容:

public class GridRowItemViewModel : ObservableViewModelBase // From previous example.
{
      private string _sampleProp;          
      public string SampleProp
      {
          get
          {
              return _sampleProp;
          }
          set
          {
              _sampleProp = value;
              OnPropertyChanged();
          }
      }
}

因此,您的Main ViewModel应该看起来像这样:

public class MainViewModel : ObservableViewModelBase // This is your DataContext.
{
     public ObservableCollection<GridRowItemViewModel> GridCollection { get; set; }
}

编辑:您不能绑定到字段,WPF不能解析字段。 它只能处理属性。 因此,通过创建子ViewModel的纯字段,您将无处可寻。 将它们更改为属性,您将可以通过属性名称在视图中访问其内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM