2012-10-08 28 views
1

我有一个ContentControl,我需要动态地将它设置为ContentTemplate无法动态更改内容模板

,所以我决定写2 DataTemplates,然后我的样式这样ContentControl一个触发器触发,并设置适当的模板(DT1/DT2)时,在我看来,模型的变化布尔依赖属性(真/假)。

但问题是,如果布尔属性主要设置为true,数据模板总会dt1和更改属性false模板不会改变dt2

由于数据触发器绑定到布尔依赖属性,不应该更改属性结果触发触发器?

笔记:

  • 有在MyView一个按钮,改变BooleanDependencyProp它是 click事件。
  • MyViewModel继承自接口 实现INotifyPropertyChanged

的XAML:

<UserControl x:Class="Views.MyView"> 
... 

<StackPanel> 
    <ContentControl Content="{Binding RelativeSource={RelativeSource AncestorType=MyView}, Path=MyViewModel}"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="true"> 
               <Setter Property="ContentTemplate"> 
                <Setter.Value> 
                 <dt1 ... /> 
                </Setter.Value> 
               </Setter> 
        <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="false"> 
               <Setter Property="ContentTemplate"> 
                <Setter.Value> 
                 <dt2 ... /> 
                </Setter.Value> 
               </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</StackPanel> 
+1

您可以查看ContentTemplateSelector属性。 –

+0

我试过了,但是和templateSelector一样。它初始化一次,它不能有依赖属性,所以我无法设置任何绑定。 –

回答

1

这是WPF框架的一个已知的缺点,如果你要申请不同的数据模板,要么通过使用可视化状态管理器更改演示文稿,或换出对于基于触发器更改的用户控件的内容数据模板,您将获得更多里程。

还有很多我可以说,但它会涉及知道你的情况和这些DataTemplates的差异,为什么你是歧义等等。此外,MVVM四处?或者带有几个视图模型的直线代码+标记样式?

+0

我明白了,那么我会检查你的解决方案,谢谢。它是MVVM/3Tier与存储库等,也是我的第一个WPF应用程序,所以我不知道这是什么最好的解决方案。基本上我可以简单地更改代码中的模板,但我认为尝试纯xaml。 –

+0

我会研究使用WPF视觉状态管理器,定义DataTrigger/GoToStateAction对。这是使用Blend 4最简单的方法 – Firoso