如何在两个不相关的触发器的基础上使用3种不同的样式



我有一个Gridview.Column,其中内容的样式由IMultiValueConverter根据另一列的内容进行更改。这部分工作符合预期。

如果两个值的值相同,则此列的文本为LightGray,否则为黑色。

<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,则该列的文本应变为红色,而不是黑色;如果为false,则FileNameColorConverter应决定该列的样式,与现在相同。

我该怎么做?我现在迷失了方向,不知道该把这个逻辑放在哪里,我很确定有一种方法可以把它也放在XAML中。

编辑

我试着在第一个触发器之后添加另一个触发器,但对我来说不起作用,如果是这样的话,我的代码怎么了?

我在第一次</DataTrigger>之后添加了这个,但没有效果。

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

在同一数据上具有独占条件的多个数据触发器对我来说非常有效。。。你能检查一下你的FileNameError是否是至少1个项目的True吗?如果您正在动态更改它,那么您是否正在引发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
}

在现有触发器之后添加另一个触发器,该触发器使用Value="True"在附加属性上触发。如果属性为true,则应覆盖现有触发器,从而允许将列设置为红色。但是,如果属性为false,则触发器将不起任何作用,并且现有触发器的效果将可见。

查看GridViewColumn.CellTemplateSelector属性。

根据某些逻辑,即DataTemplateSelector,可以为单元格提供不同的DataTemplate。

相关内容

  • 没有找到相关文章