wpf - datatriggers многократного использования - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть текущий DataTrigger:

<DataTrigger Binding="{Binding HeaderType}" Value="1">
   <Setter Property="BorderThickness" Value="5"/></DataTrigger>

Я хочу сделать то же самое со значениями 2-100

Нужно ли копировать триггер данных 99 раз или, может быть, есть лучший способ?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

Добавьте свойство в модель представления:

public bool HasImportantHeader // or something...
{
   get { return HeaderType >=1 && HeaderType <= 100; }
}

Используйте это свойство в триггере данных:

<DataTrigger Binding="{Binding HasImportantHeader}" Value="True">   
   <Setter Property="BorderThickness" Value="5"/>
</DataTrigger>

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

Допустим, вы добавили другое представление, в котором вы хотите использовать жирный текст, чтобы указать, что тип заголовка находится между 1 и 100. Просто повторно используйте свойство HasImportantHeader, что-то вроде:

<DataTrigger Binding="{Binding HasImportantHeader}" Value="True">   
   <Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>

Позже вы можете решить, что все типы заголовков до 200 должны иметь жирную рамку и полужирный текст.Это будет простой вопрос изменения реализации свойства HasImportantHeader.

2 голосов
/ 07 декабря 2010

Я использовал это в подобных ситуациях

<DataTrigger Binding="{Binding HeaderType,
                               Converter={StaticResource RangeConverter},
                               ConverterParameter=1-100}"
             Value="True">
    <Setter Property="BorderThickness" Value="5"/>
</DataTrigger>

И в преобразователе мы возвращаем true или false в зависимости от диапазонов

public class RangeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string[] ranges = parameter.ToString().Split(new char[]{'-'});
        int headerType = (int)value;
        if (headerType >= System.Convert.ToInt32(ranges[0]) &&
            headerType <= System.Convert.ToInt32(ranges[1]))
        {
            return true;
        }
        return false;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
1 голос
/ 07 декабря 2010

Для этого вам нужно использовать конвертер. Вы можете добавить конвертер в свой DataTrigger. Конвертер позволит вам передать значение и вернуть true или false.

<DataTrigger
  Binding="{Binding HeaderType, Converter={StaticResource RengeConvertor}}"
  Value="true"
  >
  <Setter Property="BorderThickness" Value="5" />
</DataTrigger>

и ваш конвертер должен выглядеть примерно так:

public class RengeConvertor : IValueConverter

{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

{

    int data = (int)value;

    if (data >= 2 && data <= 100)

        return true;

    else

        return false;

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

{

    throw new NotImplementedException();

}

}

Вы также можете найти это интересное http://zamjad.wordpress.com/2010/07/29/range-converter/

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