2014-12-30 2 views
1

Я пытаюсь изменить цвет переднего плана (цвет текста) текстовое поле, которое является DataTemplate из GridViewColumn.CellTemplate, если выбрано ListViewItem:Изменения переднего плана из текстового поля, встроенное в CellTemplate

<ListView ItemsSource="{Binding Components}" 
          Style="{StaticResource PrimaryListViewStyle}" 
          ItemContainerStyle="{DynamicResource ListViewItemContainerStyle}" 
          Width="150" 
          MinHeight="150" 
          SelectionMode="Single" 
          cal:Message.Attach="[Event SelectionChanged]=[Action ActivateAttributesView($this.SelectedItem)]"> 
        <ListView.View> 
         <GridView ColumnHeaderContainerStyle="{StaticResource PrimaryGridViewColumnHeaderStyle}"> 
          <GridViewColumn Header="Component Name"> 
           <GridViewColumn.CellTemplate> 

            <DataTemplate DataType="{x:Type viewModels:ComponentViewModel}"> 
             <TextBox Text="{Binding Name}"> 
              <TextBox.Resources> 
               <Style TargetType="{x:Type TextBox}"> 
                <Style.Triggers> 
                 <Trigger Property="ListViewItem.IsSelected" 
                   Value="False"> 
                  <Setter Property="Foreground" 
                    Value="Green" /> 
                 </Trigger> 
                 <Trigger Property="ListViewItem.IsSelected" 
                   Value="True"> 
                  <Setter Property="Foreground" 
                    Value="Black" /> 
                 </Trigger> 
                </Style.Triggers> 
               </Style> 
              </TextBox.Resources> 
             </TextBox> 
            </DataTemplate> 

           </GridViewColumn.CellTemplate> 
          </GridViewColumn> 
         </GridView> 
        </ListView.View> 
       </ListView> 

Вот изображение. К сожалению, я # м не допускается, чтобы вставить изображение непосредственно ...:

http://de.tinypic.com/r/262s8bb/8

Текст в выбранной строке будет отображаться «черный».

Thx.

ответ

1

Ваш стиль имеет триггеры для TextBox, что она применяется. TextBox не знает, выбран ли содержащий ListViewItem или нет, так что это не сработает.

Чтобы получить соединение с вмещающей ListViewItem, вы можете использовать DataTrigger вместо этого, пусть выражения RelativeSource путешествия вверх визуального дерева, пока он не найдет ListViewItem и привязать его свойству IsSelected:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Foreground" Value="Green" /> 
    <Style.Triggers> 
     <DataTrigger 
      Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" 
      Value="True"> 
      <Setter Property="Foreground" 
        Value="Black" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

Это сделало трюк! О, черт возьми! Я потратил несколько часов на это: (Теперь я должен быстро прочитать о datatriggers, чтобы понять, что здесь происходит! Thx много и счастливый новый год! –

+0

Хорошо, WPF Unleashed 4.5 говорит мне, что DataTrigger можно использовать для non DependencyProperties. Но IsSelected является привязанным свойством зависимостей от «Селектора». Я думаю, что тип свойства здесь не важен. Мне нужен DataTrigger, потому что мне не нужно указывать свойство как с триггером? Это правильно? –

+0

** DataTrigger ** работает с любым свойством, которое поддерживает уведомление об изменении, будь то DependencyProperty или свойство [CLR объекта, реализующего INotifiyPropertyChanged] (http://msdn.microsoft.com/en-us/library/ms743695 (v = vs.110) .aspx) ** Trigger ** работает только с DependencyProperties и, что более важно, только с свойствами текущего объекта. Если вы поместите триггер в стиле для Button, он будет работать для свойств этой кнопки. Ничего другого. – Frank

0

Я думаю, что вам нужно DataTrigger

<Style.Triggers> 
    <DataTrigger Binding="{Binding IsSelected}" 
     Value="True"> 
     <Setter Property="FontFamily" Value="Segoe UI Semilight"/> 
     <Setter Property="FontSize" Value="16"/> 
    </DataTrigger> 
</Style.Triggers> 
+0

Проблема: контекст данных из TextBox будет являться ComponentViewModel. Вы не знаете, имеет ли это свойство IsSelected. – Frank

+0

Приходите на голосование. В чем была проблема? OK без ComponentViewModel не будет работать, но это достойно -1? – Paparazzi

+0

Прошу прощения, но я думаю, что это неправильно. 1.) DataTrigger привязывается к DataContext по умолчанию, и вы не можете предположить, что есть свойство IsSelected. 2.) «Текст в выбранном ряду должен отображаться черным». Вы отформатировали его по-другому. Я не вижу, как это помогает новому пользователю. – Frank

0
  1. TextBox послушайте передний план изменен с ListViewItem

     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
          <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=Foreground}" /> 
         </Style> 
    
  2. ListViewItem изменил цвет переднего плана, когда IsSelected свойство изменилось

     <Style TargetType="ListViewItem"> 
          <Setter Property="Foreground" Value="Green" /> 
          <Style.Triggers> 
           <Trigger Property="IsSelected" Value="True"> 
            <Setter Property="Foreground" Value="Black" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style>