基于DataContext的属性的触发器

Jie*_*eng 10 wpf triggers

假设我要展示基于从DataContext的属性的值/隐藏的元素,我怎么能acheive呢?

// In MainWindow.xaml.cs: DataContext of MainWindow.xaml
public int Mode { get; set; } 
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

目前,我得到的错误是" 物业'模式’在类型'的StackPanel’未找到d:\ tmp目录\ WpfApplication1\TriggersAndProperties\MainWindow.xaml. "

Jul*_*ain 12

如果需要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>
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用IValueConverter了INT从转换ModeVisibility你想要的,并直接将其应用到每个文本块Visibility属性.

请注意,Dean Chalk的答案仍然有效:如果您想要更改,则必须使用DependencyProperty或执行.INotifyPropertyChangedMode