Как я могу использовать 3 разных стиля на основе двух несвязанных триггеров - PullRequest
0 голосов
/ 15 марта 2012

У меня есть 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. Если это ИСТИНА, текст этого столбца должен стать красным, а не черным, если он ложный, FileNameColorConverter должен определить стиль столбца, такой же, как сейчас.

Как я могу это сделать? В данный момент я заблудился и понятия не имею, где разместить эту логику, я совершенно уверен, что есть способ получить это и в XAML.

Редактировать

Я попытался добавить еще один триггер после первого, но у меня это не сработало, если так, то что не так с моим кодом?

Я добавил это после моего первого </DataTrigger>, но это не дало эффекта.

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

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Просмотр свойства GridViewColumn.CellTemplateSelector .

В зависимости от некоторой логики, DataTemplateSelector , вы предоставляете ячейке другой DataTemplate .

1 голос
/ 15 марта 2012

Несколько триггеров данных с исключительными условиями для одних и тех же данных отлично работают для меня ... Можете ли вы проверить, равен ли FileNameError True хотя бы 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
}
1 голос
/ 15 марта 2012

Добавьте еще один триггер после существующего, который срабатывает на дополнительном свойстве с Value="True". Это должно затем переопределить существующий триггер, если свойство имеет значение true, позволяя вам установить красный столбец. Однако, если свойство имеет значение false, триггер ничего не сделает, и эффекты существующего триггера будут видны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...