2012-02-16 94 views
0

我想封装视图/ viewmodel到另一个视图/ viewmodel。目的是要有一个弹出窗口,幻灯片面板或任何你能想到的常见行为,并在其中插入一个自定义视图/视图模型。继承或封装View/Viewmodel

我要使用通用的做这件事,但我那种坚持

父视图模型将看起来像

public class SidePanelViewModel<T> 
{ 
    public SidePanelViewModel(T enclosedViewModel) 
    { 
     EnclosedViewModel = enclosedViewModel; 
    } 

    public T EnclosedViewModel { get; private set; } 
} 

父视图会像

... whatever design and behavior ... 
<ContentPresenter Content="{Binding EnclosedViewModel}"/> 
... whatever design and behavior ... 

在我的映射文件,我想说,但这里是问题:

<DataTemplate DataType="{x:Type WPFTests:SidePanelViewModel}"> 
    <WPFTests:SidePanelView /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type WPFTests:EnclosedViewModel}"> 
    <WPFTests:EnclosedView /> 
</DataTemplate> 

这不起作用,因为viewmodel SidePanelViewModel的构造函数需要创建一个类型。

我想我想要做的是有一个视图/视图模型从另一种观点/视图模型

希望有人能对

+1

为什么你需要使用''?难道你不能只使用常规的'对象'或某种共享的基础,如'IViewModel'或'ViewModelBase'吗? – Rachel 2012-02-16 13:58:14

+0

@Rachel我不能相信我想念!我想太多花哨的技术让我变得有点愚蠢......如果你愿意的话,回答它我会验证它是一个很好的答案。 – Guillaume 2012-02-16 15:06:44

+0

作为回答发表:) – Rachel 2012-02-16 15:09:34

回答

2

为什么你需要使用<T>

难道你不能只使用常规的object或某种共享的基地,如IViewModelViewModelBase

0

在WPF泛型类的工作可以说是相当痛苦的,有时帮继承..

我建议你创建一个基类(抽象)类,它为你的(当然是虚拟的)方法实现默认行为。

+0

我知道这一点,这就是我在开始时的想法,但我需要继承该视图以及我不知道该怎么做 – Guillaume 2012-02-16 11:40:07

+0

但是ViewModel/View的职责是不同的。实际上ViewModel只是更新绑定。它不调用任何视图方法。 如果您希望您的观点具有共同的行为,请针对您的观点实施不同的课程 – 2012-02-16 11:44:07

+0

对不起,我对我的看法不够清楚。我希望看到父视图,而不仅仅是视图模型的行为。子视图/ viemodel将坐在父视图/视图模型中并由其修饰。在父视图中,我将有一些边框图像按钮...并且我不想在子视图中每次重写它们 – Guillaume 2012-02-16 11:53:51