Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的嵌套视图模型_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF中的嵌套视图模型

C# WPF中的嵌套视图模型,c#,wpf,mvvm,C#,Wpf,Mvvm,还在这里学习MVVM和WPF 我正在尝试创建一个复杂的视图模型EditArticleViewModel。它有一些类似控件的重复代码,因此我将重复代码移到了另一个类中。然后,我将另一个类的几个实例添加到EditArticleViewModel中 我将EditArticleViewModel的一个实例设置为我的窗口的DataContext。我将绑定到类别、项目和子类别。选择editem public class CategoryView { public ObservableCollecti

还在这里学习MVVM和WPF

我正在尝试创建一个复杂的视图模型
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; }
}