Связывание триггера WPF: как лучше связать значение enum с видимостью? - PullRequest
7 голосов
/ 15 сентября 2010

У меня есть пользовательский элемент управления (NameField).В нем есть стековая панель, содержащая 3 сетки: StandardView, FluidView, OtherView.Внутри кода у меня есть DependencyProperty с именем View типа NameFieldView (enum).Перечисление содержит STANDARD, FLUID, OTHER.

Я думаю, что мне нужно создать конвертер, но я не уверен, если это необходимо.Я в основном хочу сделать так, чтобы единственной видимой сеткой была та, которая соответствует значению enum ... то есть, если View = NameFieldView.STANDARD, то сетка с именем StandardView видима, а две другие - нет.1017 * Кроме того, я не уверен, должно ли это быть частью Grid.Resources / Style или Grid.Triggers?

Ответы [ 3 ]

10 голосов
/ 16 сентября 2010

Я использую триггеры данных для этого.Это выглядит примерно так:

<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 голосов
/ 15 сентября 2010

Как и многие другие WPF, это действительно зависит от вашего вкуса. Вот несколько вариантов.

Вы можете создать три IValueConverter, которые преобразуют значение свойства View в Visibility (или использовать имя перечисления в качестве ConverterParameter и создать один конвертер).

Вы можете создать три новых свойства, называемых "StandardViewIsVisible", "FluidViewIsVisible" и "OtherViewIsVisible", которые обновляются при изменении свойства View. Эти свойства будут иметь возвращаемый тип видимости. Это, безусловно, больше похоже на «MVVM», даже если вы не используете ViewModel.

Вы можете использовать DataTrigger, который устанавливает подходящую сетку Visible или Collapsed на основе текущего значения свойства View.

1 голос
/ 15 сентября 2010

Я бы создал конвертер.Если вы добавите конвертер всякий раз, когда у вас возникнет соответствующая проблема с привязкой, как эта, вы будете постепенно создавать библиотеку из них для своего приложения, что значительно упростит вам задачу в будущем.Я бы назвал это как NameFieldViewToVisibilityConverter - он должен иметь два метода:

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

Преобразование будет иметь параметр NameFieldView и возвращает значение Visibility.ConvertBack будет иметь параметр Visibility и возвращает значение NameFieldView.

Привязки будут выглядеть следующим образом:

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