Wpf 基于DataContext属性的触发器
假设我想根据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
// 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”。