2012-05-07 2 views
-2

Iまし結合パスに少しだけ違いがいくつかのスタイル:DataTriggerへのバインディングパスをWPFスタイルで渡すにはどうすればいいですか?

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

私たちは、私が唯一のXmaIマークアップとの重複を削除することができ、スタイルの唯一の違いは、DataTrigger{Binding Path=xyz}で見つけることができますか? custom styles as in this questionを作成することはできますが、設定子はハードコードされていることがわかります。DataTriggerのみを拡張できますか?

答えて

0

DataTriggerのテンプレートを作成するようです。あなたは、あなた自身の作成に頼るスタイルではないDataTriggers持つことができるので:

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

はその後、通常の1の代わりにこのCollapsingDataTriggerを使用するようにXAMLを更新します(これがで作成された名前空間を参照する必要があります) 。

+0

これらのほとんどはものはDataTriggerのSettersにありますが、これらのSettersをDataTriggersで共有できますか? –

+0

コードを統一する方法を示すために私の回答を更新します。それにもかかわらず、AngelWPFによって提案されたMultiBindingバージョンは、スタイルコードが少なくなっています。 –

+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(); 
    } 
} 

私は、アプリケーション内のすべてのフレームワークの要素にスタイルを適用するスキップする、お勧めします。将来的に複雑になる場合は、アプリケーションのGUIを遅くし、WPFのValidation Modelなどの代替アプローチを試すことができます。

あなたはまだ、あなたが交互にオーバーライドスタイルアプリケーション内のすべてのフレームワーク要素のにApp.xamlの道を探ることができ、アプリケーションのフレームワークelemetnsのすべてのタイプにスタイルを適用したい場合は...

+0

なぜすべてのフレームワーク要素にスタイルを適用していますか?私はそれがちょうどスタイルの定義だと思う、直接適用しない。私が間違っている? –

関連する問題