我有一个WPF项目(C#,Visual Studio 2010,MVVM),我有一个问题。
目前,我在ListBox中有一个项目模板。这看起来如下:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragDelta">
<cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Thumb>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
模板是'NodeVisualTemplate',它是一系列控件(如边框和文本框)。
我不知道该怎么做,以及我想做什么,是能够根据该项目中的属性将该模板替换为另一个模板。在ListBox中,每个ListBoxItem都有一个数据上下文,它是一个'ChatNodeViewModel'。我希望有一个属性可以决定使用哪个模板。
这可能吗?如果是这样,怎么办呢?
答案 0 :(得分:2)
尝试使用DataTrigger
<DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}"
Value="True">
<Setter Property="Template"
Value="{StaticResource myTemplate}"/>
</DataTrigger>
例如,如果选中复选框,上面的内容将交换模板
答案 1 :(得分:1)
您可以在DataTrigger上使用带样式的Thumb,模板,并绑定到ViewModel中的属性,即YourProperty
。
<Thumb>
<Thumb.Style>
<Style TargetType="Thumb">
<Setter Property="Template" Value="{StaticResource NodeVisualTemplate}"/>
<!--default Template ^-->
<Style.Triggers>
<DataTrigger Binding="{Binding YourProperty}" Value="0">
<Setter Property="Template" Value="{StaticResource TemplateOn0}"/>
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="1">
<Setter Property="Template" Value="{StaticResource TemplateOn1}"/>
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="2">
<Setter Property="Template" Value="{StaticResource TemplateOn2}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Thumb.Style>
</Thumb>
示例属性实现:
public int YourProperty {set;get;} = 0;
你也可以使用一些枚举,以便更容易地了解哪个模板是哪个,甚至是字符串。
如果您只想交换ListBoxItem的模板,可以使用Listbox的内置ItemTemplateSelecetor。这是sample
答案 2 :(得分:1)
您可以像这样使用<DataTemplate.Triggers>
:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DragDelta">
<cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Thumb>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding YourProperty}" Value="1">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateOne}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="2">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateTwo}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourProperty}" Value="3">
<Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateThree}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>