WPF 触发器绑定:将枚举值绑定到可见性的最佳方法是啥?

Posted

技术标签:

【中文标题】WPF 触发器绑定:将枚举值绑定到可见性的最佳方法是啥?【英文标题】:WPF Trigger Binding: What's the best way to bind an enum value to visiblity?WPF 触发器绑定:将枚举值绑定到可见性的最佳方法是什么? 【发布时间】:2011-04-12 19:47:32 【问题描述】:

我有一个用户控件 (NameField)。在其中我有一个包含 3 个网格的堆栈面板:StandardViewFluidViewOtherView。在代码隐藏中,我有一个名为ViewDependencyProperty,类型为NameFieldView (enum)。枚举包含STANDARDFLUIDOTHER

我想我必须创建一个转换器,但我不确定这是否有必要。我基本上想让它唯一可见的网格是与枚举值匹配的那个...也就是说,如果View = NameFieldView.STANDARD 那么名为StandardView 的网格是可见的,而其他两个不可见。

另外,我不确定这是否应该是 Grid.Resources / StyleGrid.Triggers 的一部分?

【问题讨论】:

旁注:小心使用“视图”作为属性名称。现在,这意味着一个非常具体的事情,模型-视图-视图模型模式是 WPF 世界中首选的操作方式。 我猜我可以称它为“NameFieldVisualState”和VisualState。但是,是的,我把谨慎抛在了脑后 :) 【参考方案1】:

我为此使用数据触发器。它看起来像这样;

<Style TargetType="DockPanel" x:Key="ViewStyle1">
   <Setter Property="Visibility" Value="Collapsed"/>
   <Style.Triggers>
     <DataTrigger Binding="Binding ViewStyle" Value="ViewStyle1">
       <Setter Property="Visibility" Value="Visible"/>
     </DataTrigger>
   </Style.Triggers>
</Style>

然后我为每种视图样式创建一个DockPanel,并且每当ViewStyle 属性更改时,就会显示相应的视图。

【讨论】:

【参考方案2】:

像很多 WPF 一样,它真的取决于你的口味。这里有几个选择。

您可以创建三个 IValueConverter,将 View 属性的值转换为 Visibility(或使用枚举名称作为 ConverterParameter 并创建一个转换器)。

您可以创建三个新属性,称为“StandardViewIsVisible”、“FluidViewIsVisible”和“OtherViewIsVisible”,它们会在 View 属性更改时更新。这些属性将是返回类型 Visibility。这显然更像是一种“MVVM”的做事方式,即使您没有使用 ViewModel。

您可以使用 DataTrigger 根据 View 属性的当前值设置适当的网格 Visible 或 Collapsed。

【讨论】:

我实际上使用了一个 ValueConverter 并使用一个参数来决定要检查哪个视图。 'Fluid' 检查 View 是否设置为 Fluid。 “其他”检查查看视图是标准的还是扩展的。并在该网格中传递了“扩展”的 2 个组合框项目,以查看视图是否已扩展。耶!【参考方案3】:

我会创建一个转换器。如果您在遇到此类适当的绑定问题时添加转换器,您将慢慢为您的应用程序构建它们的库,从而使您将来的事情变得更容易。我会称它为 NameFieldViewToVisibilityConverter - 它应该有两种方法:

public Object Convert(Object value, Type TargetType, Object param, CultureInfo Culture);
public Object ConvertBack(Object value, Type TargetType, Object param, CultureInfo Culture);

Convert 将有一个 NameFieldView 参数并返回一个可见性值。 ConvertBack 将有一个 Visibility 参数并返回一个 NameFieldView 值。

绑定看起来像这样:

<Grid Name="StandardView" Visibility="Binding View, Converter=StaticResource NameFieldViewToVisibilityConverter"  />

【讨论】:

以上是关于WPF 触发器绑定:将枚举值绑定到可见性的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

绑定到布尔值的可见性的 TargetNullValue

WPF 将 ListBox 绑定到枚举,显示描述属性

WPF 在编辑时设置默认可见性值

WPF 数据绑定:如何使用 XAML 将枚举数据绑定到组合框? [复制]

WPF - 将 UserControl 可见性绑定到属性

将枚举属性数据绑定到 WPF 中的组合框