2010-12-07 69 views
2

我目前DataTrigger:WPF - datatriggers重複使用

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

我想要做相同的值2-100

我必須複製的數據觸發99次或可能有一個更好的方法 ?

回答

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> 

後來,你可能會決定所有標題類型高達應該有厚邊框和粗體文本。這將是一個簡單的事情,改變HasImportantHeader財產的執行情況。

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/

+0

謝謝biju,我想知道是否有XAML的方式來解決它,而不涉及新的收集到ViewModel和新的轉換器。 (Microsoft如何不公開表示操作數的屬性)。 – Erez 2010-12-07 10:32:23

+0

我不認爲有任何xaml只適用於您的要求。 – biju 2010-12-07 10:39:59

2

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