我需要根据对象的值有条件地更改TextBlock绑定,该对象是我的ViewModel中OC中的许多对象之一。我确定我需要使用DataTriggers来实现这一目标。具体来说,我想动态更改下面第一个TexBlock为其Text属性绑定的属性。 OC Summary包含Name对象的集合,每个对象都有一个名为NameType的Property。如果NameType = 1我想绑定到Name1,NameType = 2绑定到Name2等。第二个TextBlock就像它显示相关值一样好。
<ItemsControl Grid.Row="1" ItemsSource="{Binding Summary}" Margin="0,3,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource TooltipLeftColumnTextStyle}" Text="{Binding Name}" />
<TextBlock Style="{StaticResource TooltipRightColumnTextStyle}" Text="{Binding Value}" />
<Border Grid.Row="1" Style="{StaticResource TooltipSeparatorBorder}" />
<Border Grid.Row="2" Style="{StaticResource TooltipSeparatorAlternateBorder}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 0 :(得分:1)
这样的事可能适合你:
<ItemsControl Grid.Row="1" ItemsSource="{Binding Summary}" Margin="0,3,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="TheTextBlock" Style="{StaticResource TooltipLeftColumnTextStyle}" Text="{Binding Name}" />
<TextBlock Style="{StaticResource TooltipRightColumnTextStyle}" Text="{Binding Value}" />
<Border Grid.Row="1" Style="{StaticResource TooltipSeparatorBorder}" />
<Border Grid.Row="2" Style="{StaticResource TooltipSeparatorAlternateBorder}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding NameType}" Value="1">
<Setter TargetName="TheTextBlock" Property="Text" Value="{Binding Name1}"/>
</DataTrigger>
<DataTrigger Binding="{Binding NameType}" Value="2">
<Setter TargetName="TheTextBlock" Property="Text" Value="{Binding Name2}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
否则,另一个选项是控制ViewModel中绑定名称的值,以便Name返回所需的值。当NameType更改时,您将在视图模型上使用参数“Name”引发PropertyChanged事件,以便UI了解文本更改。
答案 1 :(得分:0)
您正在寻找的是DataTemplateSelector,这将允许您根据传入的对象(或该对象上的属性)的值替换模板。
网上有很多比我在这里给出的更好的例子,但这应该让你开始..
http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx http://breakingdotnet.blogspot.co.uk/2012/05/data-template-selector-in-xaml.html