2012-02-17 41 views
0

我有一個List對象和一個ListView,顯示此列表。這樣的對象有一些屬性,它們綁定到ListView的列。僅在一列中更改ListView項目的前景色

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated"> 
    <ListView.View> 
     <GridView x:Name="FileNameAttributes" > 
      <GridViewColumn Header="File Name" Width="200" DisplayMemberBinding="{Binding fileName}"/> 
      <GridViewColumn Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/> 
      <GridViewColumn Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/> 
      <GridViewColumn Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/> 
      <GridViewColumn Header="New Name" Width="300" DisplayMemberBinding="{Binding newFileName}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

這部分工作正常。

現在我想在單行中更改newFileName列的前景顏色,但只有當它等於同一行中的'fileName'時。

我可以在XAML中執行此操作嗎?還是必須轉到文件後面的代碼?我想如果我可以在XAML中處理它,因爲我認爲它是一個純粹的設計問題,但我不知道,從哪裏開始或將它放在哪裏(我可以在XAML中進行字符串比較嗎? )

所以我試圖在代碼隱藏文件中處理這個問題。我認爲必須有ListView發生變化時引發的事件,我嘗試了SourceUpdated事件,但是當我更改列表的內容時,沒有輸入它。
接下來的問題是,如何訪問這些ListView項目...

任何人都可以給我一個想法,我可以解決這個問題嗎?

+1

我從來沒有這樣做我自己,但您可以嘗試創建自定義轉換器(如可見性轉換器)並將Foreground屬性綁定到此轉換器 – mslliviu 2012-02-17 07:39:42

回答

2

您可以使用MultiBinding和MultiConverter進行此操作。 你需要寫多轉換這需要文件名和newFileName,如果他們是平等的

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated"> 
      <ListView.View> 
       <GridView x:Name="FileNameAttributes" > 
        <GridViewColumn Header="File Name" Width="200" DisplayMemberBinding="{Binding fileName}"/> 
        <GridViewColumn Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/> 
        <GridViewColumn Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/> 
        <GridViewColumn Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/> 
        <GridViewColumn Header="New Name" Width="300"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding newFileName}"> 
            <TextBlock.Style> 
             <Style> 
              <Setter Property="TextBlock.Foreground" Value="Black"></Setter> 
              <Style.Triggers> 
               <DataTrigger Value="True"> 
                <DataTrigger.Binding> 
                 <MultiBinding Converter="{StaticResource EqualityConverter}"> 
                  <Binding Path="newFileName"></Binding> 
                  <Binding Path="fileName"></Binding> 
                 </MultiBinding> 
                </DataTrigger.Binding> 
             <Setter Property="TextBlock.Foreground" Value="Red"></Setter> 
            </DataTrigger> 
              </Style.Triggers> 
             </Style> 
            </TextBlock.Style> 
           </TextBlock> 

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

爲EqualityConverter的代碼如下返回true:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (values[0].ToString().Equals(values[1].ToString())) 
       return true; 
      return false; 
     } 
+0

謝謝,我在後面的代碼中創建了MultiConverter類,但是當我嘗試在資源部分中引用它時,出現「找不到類型」錯誤,我該如何引用它? – stema 2012-02-17 09:42:42

+0

非常感謝,我得到它的工作(MultiConverter類在錯誤的地方)。很棒的作品。 – stema 2012-02-17 10:04:12

2

如果你想改變任何wpf元素的風格,你應該使用樣式。如果你想在某些條件下發生,你應該使用Style.Triggers。如果你的條件屬於綁定信息,你應該使用DataTrigger。如果XAML datatrigger無法處理您的條件,請添加轉換器。

所以我建議你在GridViewColum.Style中使用數據觸發器,並使用2參數filename和newfilename的多變換器。如果相同,則返回true否則爲false。

類似的東西:

<DataTrigger Value="True"> 
    <DataTrigger.Binding> 
    <MultiBinding Converter="{StaticResource MyFileNameCheckConverter}"> 
     <Binding Path="fileName"/> 
     <Binding Path="newFileName"/> 
    </MultiBinding> 
    </DataTrigger.Binding> 
    <Setter Property="Foreground" Value="Red"/> 
</DataTrigger> 

轉換器

public class FileNameCheckConverter: IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var filename = (string)values[0]; 
     var newfilename = (string)values[1]; 

     return filename==newfilename; 
    } 

    ... 
} 

PS:不要忘記設置了 「正常」 的前景在你的風格呢!否則觸發器將無法工作。

pps:代碼是手寫的

+0

此外:由於GridViewColumn不是框架元素,因此請更改特定列的CellTemplate。 – sanguine 2012-02-17 08:52:57

+0

謝謝(+1)你給了我一些重要的提示,讓它起作用。 – stema 2012-02-17 10:05:33

相關問題