如何使用数据触发器有条件地格式化文本块

时间:2013-08-21 15:49:06

标签: wpf xaml

我需要根据对象的值有条件地更改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>

2 个答案:

答案 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