我有一个用户控件(NameField
)。在其中我有一个包含3个网格的堆叠面板:StandardView
,FluidView
,OtherView
。在代码隐藏中,我有DependencyProperty
View
类型为NameFieldView
(enum
)。枚举包含STANDARD
,FLUID
,OTHER
。
我想我必须创建一个转换器,但我不确定这是否必要。我基本上想要这样做,以便唯一可见的网格是与枚举值匹配的那个...即,如果View = NameFieldView.STANDARD
那么名为StandardView
的网格是可见的而其他两个则不可见。
此外,我不确定这是否属于Grid.Resources / Style
或Grid.Triggers
的一部分?
答案 0 :(得分: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
属性发生更改时,都会显示相应的视图。
答案 1 :(得分:7)
像很多WPF一样,这取决于你的品味。以下是一些选择。
您可以创建三个IValueConverter,将View属性的值转换为Visibility(或使用枚举名称作为ConverterParameter并创建一个转换器)。
您可以创建三个名为“StandardViewIsVisible”,“FluidViewIsVisible”和“OtherViewIsVisible”的新属性,这些属性在View属性更改时会更新。这些属性的返回类型为Visibility。即使你没有使用ViewModel,这绝对更像是一种“MVVM”的做事方式。
您可以使用DataTrigger根据View属性的当前值设置适当的网格Visible或Collapsed。
答案 2 :(得分: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}" />