2013-08-21 2 views
0

Мне нужно условно изменить привязку TextBlock на основе значения объекта, который является одним из многих в OC в моей ViewModel. Я уверен, что мне нужно использовать DataTriggers для этого. В частности, я хочу динамически изменить свойство, которое первый TexBlock ниже связывает с его текстовым свойством. Резюме OC содержит коллекцию объектов Name, и каждый объект имеет свойство NameType. Если NameType = 1, я хочу привязываться к Name1, NameType = 2 привязываться к Name2 и т. Д. Второй TextBlock отлично подходит, так как он показывает связанное значение.Как использовать Data Trigger для условного форматирования текстового блока

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

ответ

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, так что имя возвращает значение, которое вы хотите. Когда NameType изменяется, вы должны поднять событие PropertyChanged с параметром «Имя» на модели представления, чтобы пользовательский интерфейс узнал об изменении текста.

+0

Большое спасибо ... это сработало как шарм – Bayrat

+0

Прохладный, рад, что я мог бы помочь! – cunningdave

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