gpt4 book ai didi

c# - WPF中的嵌套 View 模型

转载 作者:行者123 更新时间:2023-12-03 10:22:33 26 4
gpt4 key购买 nike

仍在尝试在这里学习 MVVM 和 WPF。

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

我将设置 EditArticleViewModel 的实例作为我 window 的DataContext .我将绑定(bind)到 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 .有没有办法直接通知窗口这些类中的变化?或者我必须从每个类(class)发起一个事件并拥有 EditArticleViewModel处理该事件以发送适当的通知?

任何提示表示赞赏。

最佳答案

每个 View 应该只有一个 ViewModel,主 ViewModel 可以包含其他“ViewModel”的扩展。

所以当你设置 DataContext到您的主要 ViewModel 所有内容其中将订阅NotifyPropertyChanged事件,从而实现 INotifyPropertyChanged其他派生 ViewModel 中的接口(interface)会收到通知。

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

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

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 .它只会在您添加/删除项目时通知 View 更改,但在内容更改时不会通知。要更新项目内容更改的 View ,您应该具有以下内容:
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; }
}

编辑:您不能绑定(bind)到字段,WPF 不解析字段。它只能处理属性。因此,通过创建子 ViewModel 的普通字段,您将无处可去。将这些更改为属性,您将能够通过属性名称在 View 中访问其内容。

关于c# - WPF中的嵌套 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38816254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com