2012-05-07 48 views
-2

我有幾個款式,只有在綁定路徑略有差異:如何將綁定路徑傳遞給WPF風格的DataTrigger?

<Style TargetType="FrameworkElement" x:Key="FieldValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=FieldValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
<Style TargetType="FrameworkElement" x:Key="NumberValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=NumberValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
<Style TargetType="FrameworkElement" x:Key="TextValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=TextValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
<Style TargetType="FrameworkElement" x:Key="DateTimeValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=DateTimeValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
<Style TargetType="FrameworkElement" x:Key="DateValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=DateValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
<Style TargetType="FrameworkElement" x:Key="TimeValidationErrorStyle"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=TimeValidationError}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

我們可以發現風格之間的唯一區別是在DataTrigger{Binding Path=xyz},我可以刪除重複只有XMAL標記?我知道我們可以創建custom styles as in this question,但setter是硬編碼的 - 我們只能擴展DataTrigger嗎?

回答

0

好像你想爲DataTrigger創建一個模板。既然你不能風格DataTriggers,你不得不求助於創建自己:

public class CollapsingDataTrigger : DataTrigger 
    { 
     public CollapsingDataTrigger() 
     { 
      base.Setters.Add(new Setter(FrameworkElement.VisibilityProperty, Visibility.Collapsed)); 
     } 
    } 

然後更新您的XAML使用此CollapsingDataTrigger而不是常規的一個(你將不得不引用這個創建的命名空間) 。

+0

大多數這些事情在DataTrigger的Setters中,我可以跨DataTriggers共享這些Setters嗎? –

+0

我更新我的迴應,向您展示如何統一代碼。不過,請考慮由AngelWPF提出的MultiBinding版本,該版本創建的Style代碼較少。 –

+0

我不想在代碼中硬編碼屬性。 –

0

您可以使用單個樣式,其中包含一個MultiBinding DataTrigger和一個OR轉換器。

<Window.Resources> 
    <local:AtleastOneEmptyConverter x:Key="AtleastOneEmptyConverter"/> 
    <Style TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Visible" /> 
     <Style.Triggers> 
      <DataTrigger Value="True"> 
       <DataTrigger.Binding> 
        <MultiBinding 
         Converter="{StaticResource AtleastOneEmptyConverter}"> 
         <Binding Path="FieldValidationError"/> 
         <Binding Path="NumberValidationError"/> 
         <Binding Path="TextValidationError"/> 
         ... 
         <Binding Path="DateTimeValidationError"/> 
        </MultiBinding> 
       </DataTrigger.Binding> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

代碼背後:

public class AtleastOneEmptyConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
        object parameter, CultureInfo culture) 
    { 
     return values.Cast<string>().Any(p => string.IsNullOrEmpty(p)); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
        object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

我建議,以跳過應用樣式應用程序中的所有骨架元素。如果將來它變得越來越複雜,並且尋求一種替代方法,如WPF的Validation Model,它可以使您的應用程序GUI變慢。

如果你仍然想應用樣式的應用程序中的所有類型的框架elemetns的話可以交替探索的App.xaml方式覆蓋樣式應用程序的所有框架元素 ...

+0

爲什麼它將樣式應用於所有框架元素?我認爲這只是樣式定義,不是直接應用。我錯了嗎? –