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

7
我有一个用户控件(NameField),其中包含一个包含3个Grid的stackpanel:StandardViewFluidViewOtherView。在代码后台,我有一个名为ViewDependencyProperty,类型为NameFieldViewenum)。该枚举包含STANDARDFLUIDOTHER
我认为我必须创建一个转换器,但我不确定是否有必要。我基本上想使匹配枚举值的网格是唯一可见的...也就是说,如果View = NameFieldView.STANDARD,则名为StandardView的网格是可见的,其他两个网格则不可见。
此外,我不确定这是否应该是Grid.Resources / StyleGrid.Triggers的一部分?

附注:使用“View”作为属性名称时要小心。在WPF世界中,Model-View-ViewModel模式是首选的操作方式,而“View”则具有非常特定的含义。 - Wonko the Sane
我想我可以叫它“NameFieldVisualState”,然后是“VisualState”。但是没错,那时我把谨慎抛到了脑后 :) - myermian
3个回答

10

我使用数据触发器来实现这个功能。大概像这样;

<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属性改变时,相应的视图就会显示出来。


7

像许多WPF一样,它确实取决于您的口味。以下是几个选择。

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

您可以创建三个新属性,称为"StandardViewIsVisible"、"FluidViewIsVisible"和"OtherViewIsVisible",当View属性更改时更新这些属性。这些属性的返回类型为Visibility。即使您没有使用ViewModel,这显然更符合“MVVM”的做法。

您可以使用DataTrigger,根据View属性的当前值设置适当的网格可见或折叠。


1
我最终选择了一个ValueConverter,并使用参数来决定要检查哪个视图。'Fluid'检查View是否设置为Fluid。'Other'检查View是否为Standard或Extended。在该网格中,有2个组合框项传递'Extended'以查看View是否为Extended。太好了! - myermian

1
我会创建一个转换器。如果您在类似这样的适当绑定问题时添加转换器,您将逐渐为应用程序构建一个库,从而使未来的工作变得更加容易。我会将其命名为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参数并返回Visibility值。 ConvertBack将具有Visibility参数并返回NameFieldView值。

绑定将如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接