C# WPF中的嵌套视图模型
还在这里学习MVVM和WPF 我正在尝试创建一个复杂的视图模型C# WPF中的嵌套视图模型,c#,wpf,mvvm,C#,Wpf,Mvvm,还在这里学习MVVM和WPF 我正在尝试创建一个复杂的视图模型EditArticleViewModel。它有一些类似控件的重复代码,因此我将重复代码移到了另一个类中。然后,我将另一个类的几个实例添加到EditArticleViewModel中 我将EditArticleViewModel的一个实例设置为我的窗口的DataContext。我将绑定到类别、项目和子类别。选择editem public class CategoryView { public ObservableCollecti
EditArticleViewModel
。它有一些类似控件的重复代码,因此我将重复代码移到了另一个类中。然后,我将另一个类的几个实例添加到EditArticleViewModel
中
我将EditArticleViewModel
的一个实例设置为我的窗口的DataContext
。我将绑定到类别、项目和子类别。选择editem
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
}
公共类类别视图
{
公共可观测集合项{/**/}
公共对象SelectedItem{/*…*/}
}
公共类子类别视图
{
公共可观测集合项{/**/}
公共对象SelectedItem{/*…*/}
}
公共类EditArticleViewModel:INotifyPropertyChanged
{
公共类别视图类别{get;private set;}
公共子类别查看子类别{get;private set;}
公共EditArticleViewModel()
{
类别=新类别视图();
子类别视图子类别新建子类别视图();
}
//此处有其他属性和方法
}
如您所见,我的EditArticleViewModel
类实现了INotifyPropertyChanged
,以便在某些内容发生更改时通知可视元素
我的问题是如何将类别视图
和子类别视图
中的更改通知视觉元素。有没有办法直接通知窗口这些类中的更改?或者我必须从每个类引发一个事件,并让EditArticleViewModel
处理该事件以发送适当的通知
任何提示都值得欣赏。每个视图应该只有一个ViewModel,并且主ViewModel可以包含其他“ViewModel”
因此,当您将DataContext
设置为主ViewModel时,它的所有内容将订阅NotifyPropertyChanged
事件,从而在其他派生的ViewModel中实现INotifyPropertyChanged
接口
我建议使用INotifyPropertyChanged
接口实现一个基类,您可以从其他ViewModels中派生该基类
通过进行此更改,您应该可以解决您遇到的问题:
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();
}
因此,您的主视图模型应该如下所示:
public class MainViewModel : ObservableViewModelBase // This is your DataContext.
{
public ObservableCollection<GridRowItemViewModel> GridCollection { get; set; }
}
public类MainViewModel:observeviewmodelbase//这是您的数据上下文。
{
公共ObservableCollection GridCollection{get;set;}
}
编辑:无法绑定到字段,WPF不会解析字段。它只能处理属性。因此,通过创建子视图模型的普通字段,您将毫无进展。将这些更改为属性,您将能够通过属性名称访问视图中的内容 你能让SubcategoryView
和CategoryView
实现INotifyPropertyChanged
并让视图处理更改吗?@Michael:那么我不需要将DataContext
设置为这些类实例吗?@JonathanWood如果绑定可以在给定的对象上找到给定的属性,你不认为它也能找到它在上面找到属性的对象吗?别再借来麻烦了,写一些琐碎的代码来处理这些东西吧。你很快就会有很多真正的问题。@EdPlunkett:说什么?它可以很好地找到物体。我的问题是关于传播通知。这一定是很平常的事,我想知道人们是怎么处理的。如果你的目标是批评而不是帮助,请不要回答我的问题。@JonathanWood the。对象其中。拥有。这个财产。是什么。信息技术得到。这个通知。从…起除非你搞砸了,忽略了实现INotifyPropertyChanged。为什么传播通知?为什么要增加不必要的复杂性?我不太明白这一点。因此,在我的子类中实现INotifyPropertyChanged
就足够简单了。但是我试图理解这些通知是如何传播到父类EditArticleView
类的。我在您的代码中看不到答案。如果您希望通知子视图模型中的更改,则应在这些子视图模型中实现INotifyPropertyChanged接口。视图将看到实现并订阅NotifyPropertyChanged事件。
public class MainViewModel : ObservableViewModelBase // This is your DataContext.
{
public ObservableCollection<GridRowItemViewModel> GridCollection { get; set; }
}