2012-10-30 46 views
12

我有这势必会任务的项目控制。每个任务都有任务状态。我为每个任务状态定义了不同的数据模板,并且还定义了数据模板选择器。更改数据模板动态

问题是,我无法弄清楚如何,当任务状态是动态变化的触发数据模板选择。

我想知道如何使用的数据与数据模板一起触发。

如果这还不能工作了,我会研究其他办法,势必任务状态,如
1.附加属性。任何更改都会动态设置数据模板。
2.视觉状态管理

+0

也许这个答案也将适合你http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes – michele

+0

这个答案看过了。这可能工作,但看起来有点复杂。寻找更简单的解决方案。 – Tilak

+0

问题可能与[如何对触发datatemplateselector-时,财产变动]复制(https://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes)和[带有DataTrigger VS的ControlTemplate与DataTemplateSelector的DataTemplate](https://stackoverflow.com/questions/8926024/controltemplate-with-datatrigger-vs-datatemplate-with-datatemplateselector) – huoxudong125

回答

40

一个DataTemplateSelector并不PropertyChange响应通知,所以当你的属性改变它没有得到重新评估。

我用另一种方法是DataTriggers,基于属性改变Template

例如,这将吸引使用ContentControl所有TaskModel对象和ContentControl.Template是基于TaskModel

<DataTemplate x:Key="OpenTaskTemplate" TargetType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm an Open Task" /> 
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" TargetType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm a Closed Task" /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:TaskModel}"> 
    <ContentControl Content="{Binding }"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 

       <!-- Default Template --> 
       <Setter Property="ContentTemplate" Value="{StaticResource OpenTaskTemplate}" /> 

       <!-- Triggers to change Template --> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding TaskStatus}" Value="Closed"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ClosedTaskTemplate}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 
+0

嗯,DataTemplate中似乎不具有TARGETTYPE构件。我错过了什么吗? –

+0

@JakeGaston你使用Silverlight?我不认为隐式DataTemplates(只有TargetType设置的)在Silverlight中实现直到4.5。 – Rachel

3

只是快速注意到任何人的TaskStatus属性,发现这个难以置信的帮助和我一样 -

与WPF

目前,它看起来像你要对你的DataTemplate定义使用数据类型而不是的TargetType

<DataTemplate x:Key="OpenTaskTemplate" DataType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm an Open Task" /> 
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" DataType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm a Closed Task" /> 
</DataTemplate>