c# - 使用不同显示技术在两个 View 中显示数据的 MVVM 的正确实现

标签 c# wpf mvvm implementation

我在谷歌上四处查看,无法找出显示此数据的正确协议(protocol)。

我的应用程序在两个不同的 View ( Canvas 和 TreeView )中并排显示相同的核心数据,但每个 View 都需要不同的布局。 Canvas 仅使用平面 ObservableList 在屏幕上显示用户对象。 TreeView 将提供该数据的分类列表。由于一个 View 中需要层次结构而不是另一个 View ,创建额外的 View 模型来包装数据是否有意义?

我想尽可能多地重用 View 模型,但想避免创建任何“神”类。

例子:

Canvas:
- - - - - - - - - - - - - - - 
|    Person1      Person2   |
|  Person3      Person4     |
- - - - - - -  - - - -  - - -

TreeView:
People:
 -Adults
   -Person1
   -Person4
 -Children
   -Person2
 -Teens
   -Person3

对不起,糟糕的绘图。

最佳答案

@JMcCarty 你让我解释我上面的评论,但评论太多了

你会得到你的 ObservableCollection<People>来自您的数据源,并通过 Canvas 的一个公共(public)属性公开它。然后,您将为 TreeView 创建第二个公共(public)属性,并将您的 People 集合解析到其中。

像这样:

public class PeopleTreeItem
{
    public string Header;
    public ObservableCollection<object> Items;

    public PeopleTreeItem(string header, IEnumerable<object> items)
    {
        Header = header;
        Items = new ObservableCollection<object>() { items };
    }
}

public class SomeViewModel : ViewModelBase
{
    private ObservableCollection<Person> _peopleList;
    private PeopleTreeItem _peopleTree;

    public ObservableCollection<Person> PeopleList
    {
        get { return _people; }
    }

    public PeopleTreeItem PeopleTree
    {
        get 
        { 
            if (_peopleTree == null)
            {
                _peopleTree = new PeopleTreeItem();

                _peopleTree.Add(new PeopleTreeItem("Adults", PeopleList.Where(p => p.Type == "Adult")));
                _peopleTree.Add(new PeopleTreeItem("Teens", PeopleList.Where(p => p.Type == "Teen")));
                _peopleTree.Add(new PeopleTreeItem("Children", PeopleList.Where(p => p.Type == "Child")));
            }
            return _people; 
        }
    }

关于c# - 使用不同显示技术在两个 View 中显示数据的 MVVM 的正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748171/

相关文章:

C# WPF Gridview 不会显示数据除非点击

c# - 打印时始终未选中 WPF 复选框

c# - 使 GetRawInputDeviceInfo 和 RIDI_DEVICEINFO 与 C# 一起工作

c# - C# 应用程序中的 Environment.FailFast

c# - 如何在使用 try catch 后更好地调试

c# - 在linq c#中删除多行

wpf - 如何解决 XAML 中的 'missing type' 错误?

WPF MVVM TreeView SelectedItem

c# - MVVM-更改 View 模型中的字段时验证模型

.net - 在ListView中同步IsSelected和SelectedItem