基本上,我有以下情形:

ViewModel:FooViewModel : BaseViewModelBarViewModel : BaseViewModel浏览次数:MainViewFooViewBarView
现在,我“注入(inject)” View 并使用DataContextDataTemplate设置DataTemplateSelector。显然,我的ItemsControl ItemSource已绑定(bind)到ObservableCollection<BaseViewModel>,其中包含(现在)一个FooViewModelBarViewModel实例

问题是我想介绍一个我想利用相同的AlternateFooViewFooViewModel。我想我将创建另一个DataTemplate并让我的DataTemplateSelector返回它,但是需要有特殊的逻辑来确定要返回哪个DataTemplate(我不能只是通过那里的ViewModel),这意味着我必须在BaseViewModel中具有某种类型的属性或字段。我不知道这是否真的是个好主意,因为这似乎是将字段/属性引入到仅用于选择 View 的ViewModel中。这不会影响我的单元测试,但是仅包含一个字段来帮助决定选择哪个UI View 似乎是一种浪费。我认为这不会破坏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的原因。这种类型的逻辑通常放在模板选择器中,效果很好。如果不想将该逻辑放入模板选择器,请考虑使用Routed Template Selection方法将其外部化。这样可以很容易地通过使用路由事件来委托(delegate)模板选择逻辑。

您在评论中提出的有关使用DataTrigger的想法也可以奏效,但这又重新引入了对VM对象的属性的需求,该属性指示要加载的 View (您说不需要的 View )。我认为,这不一定是一件坏事。

关于wpf - WPF DataTemplate/DataTemplateSelector —由2个不同的View使用的ViewModel的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5667522/

10-12 01:38