我正在尝试使用触发器设置矩形 (WPF) 的颜色,具体取决于 bool DependencyProperty,我将其绑定(bind)到矩形的 Tag 属性。
我有以下代码:
public partial class MainWindow : Window
{
public Boolean isAutoStart
{
get { return (Boolean)GetValue(isAutoStartProperty); }
set { SetValue(isAutoStartProperty, value); }
}
public static readonly DependencyProperty isAutoStartProperty =
DependencyProperty.Register("isAutoStart", typeof(Boolean),
typeof(MainWindow), new PropertyMetadata(true));
private void Window_Loaded(object sender, RoutedEventArgs e)
{
isAutoStart = false;
}
}
在 XAML 中:
<Window.Resources>
<Style x:Key="TriggerDark" TargetType="Rectangle">
<Setter Property="Fill" Value="Green" />
<Style.Triggers>
<Trigger Property="Tag" Value="False">
<Setter Property="Fill" Value="Red" />
</Trigger>
<Trigger Property="Tag" Value="True">
<Setter Property="Fill" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Rectangle Style="{StaticResource ResourceKey=TriggerDark}" Tag="{Binding Path=isAutoStart, UpdateSourceTrigger=PropertyChanged}">
如果我将“True”或“False”硬编码到矩形的标记属性中,触发器将正常工作。 如果我在运行时将标签属性的值打印到控制台,则绑定(bind)有效,但触发器不会触发。
知道我做错了什么吗?
谢谢!
最佳答案
您的触发器尝试将 bool 值 true 与字符串“True”进行比较,因为 Tag 是一个对象属性,因此将存储 bool 值,而您的触发器的值是一个字符串。 PHP 会喜欢它,而不是 WPF。 ;)
如果您想保留 Trigger 而不是 DataTrigger,您可以创建一个静态类:
public static class BooleanHelper {
public static bool False {
get { return false; }
}
public static bool True {
get { return true; }
}
}
然后Style会写成:
<Style x:Key="TriggerDark" TargetType="Rectangle">
<Setter Property="Fill" Value="Green"/>
<Style.Triggers>
<Trigger Property="Tag" Value="{x:Static local:BooleanHelper.True}">
<Setter Property="Fill" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
归功于 Michael Mairegger关于这个想法。
关于c# - 将属性绑定(bind)到依赖属性时,触发器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38245529/