基于DataContext的属性的触发器

时间:2010-11-28 08:35:08

标签: wpf triggers

假设我想根据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”类型中找不到“属性'模式'。D:\ tmp \ WpfApplication1 \ TriggersAndProperties \ MainWindow.xaml

2 个答案:

答案 0 :(得分:11)

如果您想要可以处理绑定的触发器,则需要使用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属性。

请注意,Dean Chalk的答案仍然有效:如果您希望DependencyProperty上的更改触发,则必须使用INotifyPropertyChanged或实施Mode

答案 1 :(得分:1)

你的属性'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); }
    }
}