我有当前的DataTrigger:
<DataTrigger Binding="{Binding HeaderType}" Value="1">
<Setter Property="BorderThickness" Value="5"/></DataTrigger>
我想用值2-100
做同样的事情我是否必须复制数据触发器99次或者有更好的方法?
答案 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/