wpf - datatriggers重复使用

时间:2010-12-07 10:03:15

标签: wpf triggers

我有当前的DataTrigger:

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

我想用值2-100

做同样的事情

我是否必须复制数据触发器99次或者有更好的方法?

3 个答案:

答案 0 :(得分:3)

向视图模型添加属性:

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属性的实现是一件简单的事。

答案 1 :(得分:2)

我在类似的情况下使用过它

<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;
    }
}

答案 2 :(得分:1)

您需要为此目的使用转换器。您可以在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/