我需要以不同方式呈现一个对象,两次。
public class Item
{
public string Name{get;set;}
public string Content{get;set;}
}
我的第一个解决方案是保持简单:
public class MainViewModel
{
// collection of items (treeview navigation)
public BindingList<ItemViewModel> Items{get;set;}
// selected item (from treeview navigation)
// used for textbox edit
public ItemViewModel SelectedItem{get;set;}
}
public class ItemViewModel
{
// Used for treeview navigation
public bool IsSelected{get;set;}
public bool IsExpanded{get;set;}
public bool IsInEditNameMode{get;set;}
public BindingList<ItemViewModel> Children{get;set;}
public void BuildChildren();
// Used for treeview display/rename
// Used for textbox display/rename
public string Name{get;set;}
// Used for textbox edit
public string Content{get;set;}
}
这种方法很有效。 但随着应用程序变得越来越复杂,视图模型越来越受到“污染”。
例如,为同一视图模型添加其他演示文稿(高级属性,图表表示等)
public class ItemViewModel
{
// Used for Advanced properties
public BindingList<PropertyEntry> Properties {get;set;}
public PropertyEntry SelectedProperty{get;set;}
// Used for graph relationship
public BindingList<ItemViewModel> GraphSiblings{get;set;}
public bool IsGraphInEditNameMode{get;set;}
public bool IsSelectedGraphNode {get;set;}
public void BuildGraphSiblings();
// Used for treeview navigation
public bool IsNavigationInEditNameMode{get;set;}
public bool IsSelectedNavigationNode{get;set;}
public bool IsExpandedNavigationNode{get;set;}
public BindingList<ItemViewModel> NavigationChildren{get;set;}
public void BuildNavigationChildren();
// Used for treeview display/rename
// Used for textbox display/rename
// Used for graph display
// Used for Advanced properties display
public string Name{get;set;}
// Used for textbox edit
public string Content{get;set;}
}
目前,我仍在使用单一视图模型进行多个演示,因为它可以使所选项目在所有演示文稿中保持同步。
此外,我不必保留重复的属性(名称/内容)。
最后,PropertyChanged通知有助于更新项目的所有表示(即,在导航更新TextBox / Graph / Advanced属性/等中更改名称)。
但是,这也违反了几项原则(单一责任,最低权限等)。
但是我不太确定如何重构它,而不需要编写大量代码来保持同步/属性通知在每个新视图模型中保持工作/复制模型的属性等等。
我想知道的是:
如果由您决定,您将如何解决这个问题?
目前,一切仍然有效。我觉得代码可以进一步改进,这就是我需要帮助的地方。
答案 0 :(得分:1)
如何使用继承?拥有一个基本的ItemViewModel
,然后将其子类化以创建一个TreeViewItemViewModel
,您可以在其中添加与子类中此项目的树视图呈现相关的属性。
答案 1 :(得分:0)
我们可以,
这使您可以在运行时灵活地实例化/注入/切换行为。 是的,尝试使用策略模式来制作更清晰,单一责任,易于维护的代码。