2010-12-02 58 views
0

我有兩個帶有觸發器的ListViews,它們會將背景顏色更改爲深灰色,將前景色更改爲白色。 問題是,當我在第一個列表視圖中選擇一個項目,然後在第二個列表視圖中選擇一個項目時,第一個listview前景中的項目不再變黑,並且它保持白色。WPF - 帶觸發器的問題

alt text

的XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="190*" /> 
     <RowDefinition Height="121*" /> 
    </Grid.RowDefinitions> 
    <Grid.Resources> 
     <ResourceDictionary> 
      <Style x:Key="@ListViewItemStyle" TargetType="{x:Type ListViewItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType='{x:Type ListViewItem}'> 
          <Grid SnapsToDevicePixels="True" Margin="0"> 
           <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" /> 
           <GridViewRowPresenter x:Name="Content" TextBlock.Foreground="{TemplateBinding Foreground}" 
         Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}" /> 
          </Grid> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsSelected" Value="true"> 
            <Setter Property="TextElement.Foreground" Value="White" TargetName="Content" /> 
            <Setter Property="Background" Value="DarkGray" TargetName="Bd"/> 
           </Trigger> 
           <MultiTrigger> 
            <MultiTrigger.Conditions> 
             <Condition Property="IsSelected" Value="true" /> 
             <Condition Property="Selector.IsSelectionActive" Value="false" /> 
            </MultiTrigger.Conditions> 
            <Setter Property="Background" TargetName="Bd" 
          Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> 
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> 
           </MultiTrigger> 
           <Trigger Property="IsEnabled" Value="false"> 
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

      <DataTemplate x:Key="@TextCellTemplate"> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 

      <DataTemplate x:Key="@TrubleCellTemplate"> 
       <Rectangle Width="20" Height="20" Fill="Black"></Rectangle> 
      </DataTemplate> 

     </ResourceDictionary> 
    </Grid.Resources> 


    <ListView ItemsSource="{Binding Persons}" Style="{DynamicResource @ListView}" ItemContainerStyle="{DynamicResource @ListViewItemStyle}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="40" CellTemplate="{DynamicResource @TextCellTemplate}" /> 
       <GridViewColumn Width="131" CellTemplate="{DynamicResource @TrubleCellTemplate}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

    <ListView ItemsSource="{Binding Persons}" Style="{DynamicResource @ListView}" ItemContainerStyle="{DynamicResource @ListViewItemStyle}" Grid.Row="1"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="40" CellTemplate="{DynamicResource @TextCellTemplate}" /> 
       <GridViewColumn Width="131" CellTemplate="{DynamicResource @TrubleCellTemplate}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

</Grid> 
+0

只是一個預感......看看是否將`x:Shared =「false」`添加到ResourceDictionary中的樣式定義(元素)可以解決您的問題。 – Gishu 2010-12-02 08:47:05

回答

0

你得到你的模板兩個觸發器之間的干擾。當您第一次選擇ListView#1中的值時,第一個IsSelected觸發器變爲活動狀態。這將覆蓋TemplateBinding中「內容」的TextBlock.Foreground值爲固定值White。

當ListView#1失去焦點到ListView#2時,第二個觸發器(用於IsSelected和IsSelectionActive的MultiTrigger)也被激活。這導致「Bd」的背景設置爲不同的值(與其他觸發器相同),並且因爲它稍後在Triggers集合中聲明,所以會覆蓋仍然處於活動狀態的前一個觸發器。

前臺設置人員應該會發生同樣的情況,但MultiTrigger中的設置是在父級控件上設置Foreground而不是「內容」。因爲「內容」不再使用TemplateBinding來拉入父控件的前景值,所以第一個觸發器的白色值在「Content」元素上保持活動狀態。