我目前DataTrigger:WPF - datatriggers重複使用
<DataTrigger Binding="{Binding HeaderType}" Value="1">
<Setter Property="BorderThickness" Value="5"/></DataTrigger>
我想要做相同的值2-100
我必須複製的數據觸發99次或可能有一個更好的方法 ?
我目前DataTrigger:WPF - datatriggers重複使用
<DataTrigger Binding="{Binding HeaderType}" Value="1">
<Setter Property="BorderThickness" Value="5"/></DataTrigger>
我想要做相同的值2-100
我必須複製的數據觸發99次或可能有一個更好的方法 ?
添加屬性,以您的視圖模型:
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>
後來,你可能會決定所有標題類型高達應該有厚邊框和粗體文本。這將是一個簡單的事情,改變HasImportantHeader
財產的執行情況。
您需要爲此目的使用轉換器。您可以在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/
我VE在類似情況下
<DataTrigger Binding="{Binding HeaderType,
Converter={StaticResource RangeConverter},
ConverterParameter=1-100}"
Value="True">
<Setter Property="BorderThickness" Value="5"/>
</DataTrigger>
而且在轉換器中使用此,我們返回根據真或假的範圍
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;
}
}
謝謝biju,我想知道是否有XAML的方式來解決它,而不涉及新的收集到ViewModel和新的轉換器。 (Microsoft如何不公開表示操作數的屬性)。 – Erez 2010-12-07 10:32:23
我不認爲有任何xaml只適用於您的要求。 – biju 2010-12-07 10:39:59