WPF DataTemplate / DataTemplateSelector —由2个不同的View使用的ViewModel的最佳方法?

问题描述

| 基本上,我有以下情形: viewmodel:
Fooviewmodel : Baseviewmodel
Barviewmodel : Baseviewmodel
浏览次数
MainView
FooView
BarView
现在,我“注入”视图并使用
DataTemplate
DataTemplateSelector
设置
DataContext
。显然,我的
ItemsControl
ItemSource
绑定到
ObservableCollection<Baseviewmodel>
,其中包含(现在)实例
Fooviewmodel
Barviewmodel
问题是我想介绍一个我想使用相同的ѭ11的ѭ13。我想我将创建另一个
DataTemplate
并让我的
DataTemplateSelector
返回它,但是需要有特殊的逻辑来确定要返回的DataTemplate(我不能只是通过那里的viewmodel),这意味着我在Baseviewmodel中必须具有某种类型的属性或字段。我不知道这是否真的是个好主意,因为这似乎是将字段/属性引入到仅用于选择视图的viewmodel中。这不会影响我的单元测试,但是包含一个字段只是为了帮助决定选择哪个UI视图似乎是一种浪费。我不认为这会破坏MVVM,但是我很好奇是否有人还有其他更好的主意吗?我不喜欢的替代想法甚至更多... 想法2: -将Fooviewmodel转换为2个不同的Fooviewmodel扩展的基类(即BaseFooviewmodel,Fooviewmodel,DifferentFooviewmodel)。这似乎很愚蠢,因为除了Fooviewmodel和DifferentFooviewmodel的类类型外,它们之间确实没有任何区别。 想法3: -只需复制Fooviewmodel并将其制成Fooviewmodel2(它将与Fooviewmodel完全相同)。这似乎比想法2更糟。 样本代码(明显调整):
public abstract class Baseviewmodel : NotificationObject
{
    //Common Stuff
}

public abstract Mainviewmodel : NotificationObject
{
    public Mainviewmodel()
    {
        MyItems = new ObservableCollection<Baseviewmodel>()
        {
            new Fooviewmodel();
            new Barviewmodel();
            new Fooviewmodel(); //New Item -- I want it to use the DifferentFooView
        }
        //Load items from a DAL later
    }

    public ObservableCollection<Baseviewmodel> MyItems { get; set; }

    //Other Stuff
}

<l:MyItemsControl ItemSource={Binding MyItems} ContentTemplateSelector={StaticResource MyTemplateSelector} />
谢谢!     

解决方法

我同意krishnaaditya的观点,这个问题实际上归结为根据ViewModel的状态决定使用哪个View的原因。这种类型的逻辑通常放在模板选择器中,效果很好。如果您不想将该逻辑放入模板选择器,请考虑使用我的“路由模板选择”方法对其进行外部化。这样可以很容易地通过使用路由事件来委托模板选择逻辑。 您在评论中提出的有关使用DataTrigger的想法也可以奏效,但这又重新引入了对VM对象的属性的需求,该属性指示要加载哪个视图(您说不想)。我认为,这不一定是一件坏事。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...