[英]wpf binding upwards: bind to view model property inside nested uiElement
[英]Nested view model in WPF
仍然尝试在此处学习MVVM和WPF。
我正在尝试创建一个复杂的视图模型EditArticleViewModel
。 它有一些针对相似控件重复的代码,因此我将重复的代码移到了另一个类中。 然后,我将另一个类的几个实例添加到EditArticleViewModel
。
我将把EditArticleViewModel
的实例设置为窗口的DataContext
。 我将绑定到Categories.Items
和Subcategories.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
以便在发生更改时可以通知可视元素。
我的问题是关于如何通知视觉元素有关CategoryView
和SubcategoryView
更改的信息。 有没有一种方法可以直接向窗口通知这些类中的更改? 还是我必须从每个类中引发一个事件并让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.