假设我想根据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 ”
答案 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); }
}
}