Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
Wpf 基于DataContext属性的触发器_Wpf_Triggers - Fatal编程技术网

Wpf 基于DataContext属性的触发器

Wpf 基于DataContext属性的触发器,wpf,triggers,Wpf,Triggers,假设我想根据DataContext中的属性值显示/隐藏元素,如何实现它 // In MainWindow.xaml.cs: DataContext of MainWindow.xaml public int Mode { get; set; } 在XAML中,我想显示基于模式的隐藏元素。我怎样才能使下面的工作?或者,实施这一目标的适当方式是什么 <StackPanel> <StackPanel.Triggers> <Trigger Pro

假设我想根据DataContext中的属性值显示/隐藏元素,如何实现它

// In MainWindow.xaml.cs: DataContext of MainWindow.xaml
public int Mode { get; set; } 
在XAML中,我想显示基于
模式的隐藏元素。我怎样才能使下面的工作?或者,实施这一目标的适当方式是什么

<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”中找不到“Property'Mode”。D:\tmp\WpfApplication1\TriggersAndProperties\MainWindow.xaml“

您的属性“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); }
    }
}

如果希望触发器能够在绑定上工作,则需要使用
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从
模式
转换为所需的
可见性
,并将其直接应用于每个文本块
可见性
属性


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

如果我有一个多触发器,其中一个条件是datatrigger,该怎么办?was是ui元素属性吗?出现编译错误MC4011:无法在样式设置上设置TargetName属性我们的示例不起作用。“无法识别名称“txt1”。