-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}in DataTrigger,我可以仅使用 XMAL 标记删除重复项吗?我知道我们可以像这个问题一样创建自定义样式,但是设​​置器是硬编码的——我们只能扩展 DataTrigger 吗?

4

2 回答 2

0

好像您想为 DataTrigger 创建一个模板。由于您无法设置 DataTriggers 的样式,因此您必须自己创建:

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

然后更新您的 XAML 以使用此 CollapsingDataTrigger 而不是常规的(您必须引用创建它的命名空间)。

于 2012-05-07T07:20:10.573 回答
0

您可以在其中使用带有MultiBindingDataTrigger 和 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 变慢并寻求替代方法,例如Validation ModelWPF。

如果您仍想将样式应用于应用程序中的所有类型的框架元素,那么您可以交替探索 App.xaml 方法来覆盖应用程序中所有框架元素的样式...

于 2012-05-07T07:51:48.823 回答