-2

私はいくつかのスタイルを持っていますが、バインディング パスにわずかな違いがあります。

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

スタイル間の唯一の違いは にあります{Binding Path=xyz}。XMALDataTriggerマークアップだけで重複を削除できますか? この質問のようにカスタム スタイルを作成できることはわかっていますが、セッターはハード コードされています。DataTrigger のみを拡張できますか?

4

2 に答える 2

0

DataTrigger のテンプレートを作成したいようです。DataTriggers のスタイルを設定できないため、独自の作成に頼る必要があります。

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

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

于 2012-05-07T07:20:10.573 に答える
0

MultiBindingDataTrigger と OR コンバーターを含む1 つのスタイルを使用できます。

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

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

アプリケーション内のすべてのタイプのフレームワーク要素にスタイルを適用したい場合は、代わりに App.xaml の方法を調べて、アプリケーション内のすべてのフレームワーク要素のスタイルをオーバーライドできます...

于 2012-05-07T07:51:48.823 に答える