Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF触发器绑定:什么';将枚举值绑定到可见性的最佳方法是什么?_C#_Wpf_Triggers_Styles - Fatal编程技术网

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

C# WPF触发器绑定:什么';将枚举值绑定到可见性的最佳方法是什么?,c#,wpf,triggers,styles,C#,Wpf,Triggers,Styles,我有一个用户控件(NameField)。其中我有一个stackpanel,包含3个网格:StandardView,FluidView,OtherView。在代码隐藏中,我有一个名为View的dependencProperty,类型为NameFieldView(enum)。枚举包含标准,流体,其他 我想我必须创建一个转换器,但我不确定这是否必要。我基本上想让它成为唯一可见的网格是匹配枚举值的网格。。。也就是说,如果View=NameFieldView.STANDARD则名为StandardView

我有一个用户控件(
NameField
)。其中我有一个stackpanel,包含3个网格:
StandardView
FluidView
OtherView
。在代码隐藏中,我有一个名为
View
dependencProperty
,类型为
NameFieldView
enum
)。枚举包含
标准
流体
其他

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


另外,我不确定这是否应该是
Grid.Resources/Style
Grid.Triggers

像很多WPF一样,这取决于你的品味。这里有一些选择

您可以创建三个将视图属性的值转换为可见性的IValueConverter(或者将枚举名称用作ConverterParameter并创建一个转换器)

您可以创建三个名为“StandardViewIsVisible”、“FluidViewIsVisible”和“OtherViewIsVisible”的新属性,这些属性在视图属性更改时更新。这些属性将具有返回类型可见性。这显然更像是一种“MVVM”方式,即使您不使用ViewModel


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

我将创建一个转换器。如果您在遇到类似这样的绑定问题时添加转换器,您将为应用程序缓慢地构建一个转换器库,从而使将来的工作更加轻松。我将其称为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将具有可见性参数并返回NameFieldView值

绑定将如下所示:

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

我使用数据触发器进行此操作。它看起来像这样

<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
属性更改时,都会显示相应的视图。

侧注:小心使用“视图”作为属性名称。在WPF世界中,模型-视图-视图-模型模式是首选的操作方式,这意味着一件非常特殊的事情。我想我可以称之为“NameFieldVisualState”和VisualState。但是,是的,我在那里提出了警告:)我实际上使用了一个ValueConverter,并使用一个参数来决定要检查哪个视图“流体”检查视图是否设置为“流体”“其他”检查视图是标准视图还是扩展视图。在该网格中,2个组合框项传入“Extended”,以查看视图是否已扩展。耶!