Триггеры, основанные на свойствах из DataContext - PullRequest
9 голосов
/ 28 ноября 2010

Предположим, я хочу показать / скрыть элементы на основе значений свойств из DataContext, как я могу их получить?

// In MainWindow.xaml.cs: DataContext of MainWindow.xaml
public int Mode { get; set; } 

В XAML я хочу показать скрытые элементы на основе Mode.Как я могу заставить работать ниже?Или как правильно реализовать это?

<StackPanel>
    <StackPanel.Triggers>
        <Trigger Property="Mode" Value="1">
            <Setter TargetName="txt1" Property="Visibility" Value="Visible" />
            <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="txt3" Property="Visibility" Value="Visible" />
        </Trigger>
        <Trigger Property="Mode" Value="2">
            <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="txt2" Property="Visibility" Value="Visible" />
            <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" />
        </Trigger>
    </StackPanel.Triggers>
    <TextBlock Text="TextBlock 1" x:Name="txt1" />
    <TextBlock Text="TextBlock 2" x:Name="txt2" />
    <TextBlock Text="TextBlock 3" x:Name="txt3" />
</StackPanel>

В настоящее время я получаю сообщение об ошибке: « Свойство« Режим »не найдено в типе StackPanel.\ TriggersAndProperties \ MainWindow.xaml"

Ответы [ 2 ]

11 голосов
/ 28 ноября 2010

Вам нужно использовать DataTriggers, если вы хотите, чтобы триггеры могли работать с привязками.Проблема в том, что DataTriggers доступны только для стиля и шаблона, поэтому вам нужно определить один из них следующим образом:

<StackPanel>
  <StackPanel.Style>
    <Style TargetType="{x:Type StackPanel}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Mode}" Value="1">
          <Setter TargetName="txt1" Property="Visibility" Value="Visible" />
          <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" />
          <Setter TargetName="txt3" Property="Visibility" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=Mode}" Value="2">
          <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" />
          <Setter TargetName="txt2" Property="Visibility" Value="Visible" />
          <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </StackPanel.Style>
  <TextBlock Text="TextBlock 1" x:Name="txt1" />
  <TextBlock Text="TextBlock 2" x:Name="txt2" />
  <TextBlock Text="TextBlock 3" x:Name="txt3" />
</StackPanel>

Другим решением будет использование IValueConverter, которое преобразует int из Mode вVisibility, который вы хотите, и применить его непосредственно к каждому текстовому блоку Visibility свойство.

Обратите внимание, что ответ Дина Чела остается действительным: вы должны использовать DependencyProperty или реализовать INotifyPropertyChanged, если хотитеизменяется на Mode для запуска.

1 голос
/ 28 ноября 2010

Ваше свойство 'Mode' должно быть свойством зависимости, чтобы использовать его следующим образом:

public class MainViewModel : DependencyObject
{
    readonly DependencyProperty ModeProperty = DependencyProperty
        .Register("Mode", typeof(int), typeof(MainViewModel));

    public int Mode
    {
        get { return (int) GetValue(ModeProperty); }
        set { SetValue(ModeProperty, value); }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...