2010-09-15 65 views
6

我有一个用户控件(NameField)。在它内部,我有一个包含3个网格的StackPanel:StandardView,FluidView,OtherView。在代码隐藏中,我有一个名为ViewFormView(Enum)类型的DependencyProperty。该枚举包含STANDARD,FLUID,OTHER。WPF触发器绑定:将枚举值绑定到可见性的最佳方式是什么?

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

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

+0

边注:小心使用“视图”作为属性名称。这意味着现在使用Model-View-ViewModel模式的一个非常具体的事情,它是WPF世界中首选的工作方式。 – 2010-09-15 17:54:51

+0

我可以称之为“NameFieldVisualState”,我猜想和VisualState。但是,是的,我在那里提醒小心:) – 2010-09-15 17:55:58

回答

7

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

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

您可以创建三个名为“StandardViewIsVisible”,“FluidViewIsVisible”和“OtherViewIsVisible”的新属性,该属性在View属性更改时得到更新。这些属性将是返回类型可见性。即使您没有使用ViewModel,这绝对是更多的“MVVM”做事方式。

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

+1

我实际上使用了一个ValueConverter,并使用一个参数来决定检查哪个视图。 '流体'检查查看是否设置为流体。 '其他'检查View是标准还是扩展。在该网格中,2个组合框项目在“扩展”中传递,以查看是否扩展了视图。好极了! – 2010-09-15 20:16:28

1

我会创建一个转换器。如果您在遇到像这样的适当绑定问题时添加了转换器,您将慢慢为应用程序构建一个转换器库,从而使您在将来更容易。我只能说这有点像NameFieldViewToVisibilityConverter - 它应该有两个方法:

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

转换将有NameFieldView PARAM并返回一个可见值。 ConvertBack将具有可见性参数并返回NameFieldView值。

的绑定是这样的:

<Grid Name="StandardView" Visibility="{Binding View, Converter={StaticResource NameFieldViewToVisibilityConverter}" /> 
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属性的变化,适当的视图显示。