2012-03-15 130 views
0

3個不同的風格我有一個Gridview.Column其中內容的風格依賴於另一列由IMultiValueConverter內容改變。這部分按預期工作。如何使用基於兩個不相關的觸發器

如果這兩個值的值相同,則此列的文字是淺灰色,否則黑。

<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 FileNameColorConverter}"> 
             <!--<Binding Path="Selected"/>--> 
             <Binding Path="newFileName"/> 
             <Binding Path="fileName"/> 
            </MultiBinding> 
           </DataTrigger.Binding> 
           <Setter Property="TextBlock.Foreground" Value="LightGray"></Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
      </TextBlock> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</GridViewColumn> 

現在我在此對象中有另一個屬性綁定到此GridView。如果這是TRUE,則此列的文本應該變爲紅色,而不是黑色,如果它爲假,則FileNameColorConverter應該決定列的樣式,與現在相同。

我怎樣才能做到這一點?我目前在迷失方向,不知道該把邏輯放在哪裏,我相當確信在XAML中也有這種方法。

編輯

我嘗試的第一個後加入另一個觸發,但它並沒有爲我工作,如果這是要走的路,什麼是錯我的代碼?

我添加了這個後,我的第一個</DataTrigger>但它並沒有產生影響。

<DataTrigger Value="True"> 
    <DataTrigger.Binding> 
      <Binding Path="FileNameError"/> 
    </DataTrigger.Binding> 
    <Setter Property="TextBlock.Foreground" Value="Red"></Setter> 
</DataTrigger> 

回答

1

多個數據與同一數據工作獨佔條件觸發我的完美......你能不能檢查,如果你FileNameErrorTrue爲atleast 1項?如果你動態改變它,那麼你是否在提升PropertyChanged事件?

你可以試試我的代碼,看看...

XAML:

<Page.Resources> 
    <local:MultiBindingConverter x:Key="MultiBindingConverter"/> 
    <coll:ArrayList x:Key="MyData"> 
     <local:Student Id="1" local:Student.Name="Test1" Active="False"/> 
     <local:Student Id="2" local:Student.Name="Test2" Active="True"/> 
     <local:Student Id="3" local:Student.Name="Test3" Active="False"/> 
     <local:Student Id="4" local:Student.Name="Test4" Active="False"/> 
    </coll:ArrayList> 
</Page.Resources> 
<Grid> 
    <ListBox ItemsSource="{StaticResource MyData}" 
      DisplayMemberPath="Name"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Style.Resources> 
        <SolidColorBrush 
         x:Key="{x:Static SystemColors.HighlightBrushKey}" 
         Color="Yellow"/> 
       </Style.Resources> 
       <Style.Triggers> 
        <DataTrigger Value="True"> 
         <DataTrigger.Binding> 
          <MultiBinding 
           Converter="{StaticResource 
            MultiBindingConverter}"> 
           <Binding Path="Id"/> 
           <Binding Path="Active"/> 
          </MultiBinding> 
         </DataTrigger.Binding> 
         <Setter Property="Foreground" Value="Red"/> 
        </DataTrigger> 
        <DataTrigger Value="3"> 
         <DataTrigger.Binding> 
          <Binding Path="Id"/> 
         </DataTrigger.Binding> 
         <Setter Property="Foreground" Value="Blue"/> 
        </DataTrigger> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Foreground" Value="Gray"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
</Grid> 

代碼背後:

public class MultiBindingConverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, 
    object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values[0] != DependencyProperty.UnsetValue 
      && values[0] != null && values[1] != null) 
     { 
      var value1 = (int)values[0]; 
      var value2 = (bool)values[1]; 

      var result = (value1 > 1 && value2); 

      if (result) 
      { 
       return true; 
      } 

      return false; 
     } 

     return false; 
    } 

    public object[] ConvertBack 
     (object value, Type[] targetTypes, 
      object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

public class Student : INotifyPropertyChanged 
{ 
    public int Id 
    { 
     get; 
     set; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 


    public bool Active 
    { 
     get; 
     set; 
    } 

    public Student() 
    { } 

    public Student(int id, string name) 
    { 
     this.Id = id; 
     this.Name = name; 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 
+0

哇,你可以看到我的錯誤...我忘了提高該屬性的'NotifyPropertyChanged'。謝謝你的提示。 – stema 2012-03-15 12:23:48

1

現有的一個觸發與Value="True"的附加屬性後添加另一個觸發。如果屬性爲true,則應該覆蓋現有的觸發器,從而允許您將該列設置爲紅色。但是,如果該屬性爲false,則觸發器將不執行任何操作,並且現有觸發器的效果將可見。

+0

那是我提出的想法,但它不不爲我工作。我用這段代碼更新了我的問題,也許你可以告訴我我做錯了什麼。 – stema 2012-03-15 09:35:12

+0

我忘了提高該屬性的'NotifyPropertyChanged'。你向我展示的+1,我正走在正確的道路上。 – stema 2012-03-15 12:25:30