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 个网格的堆栈面板:StandardView
、FluidView
、OtherView
。在代码隐藏中,我有一个名为View
的DependencyProperty
,类型为NameFieldView
(enum
)。枚举包含STANDARD
、FLUID
、OTHER
。
我想我必须创建一个转换器,但我不确定这是否有必要。我基本上想让它唯一可见的网格是与枚举值匹配的那个...也就是说,如果View = NameFieldView.STANDARD
那么名为StandardView
的网格是可见的,而其他两个不可见。
另外,我不确定这是否应该是 Grid.Resources / Style
或 Grid.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 触发器绑定:将枚举值绑定到可见性的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章