【发布时间】:2016-11-09 18:36:46
【问题描述】:
我正在尝试使用触发器设置矩形 (WPF) 的颜色,具体取决于我绑定到矩形的 Tag 属性的布尔 DependencyProperty。
我有以下代码:
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”硬编码到矩形的标记属性中,触发器就会正常工作。 如果我在运行时将标签属性的值打印到控制台,则绑定有效,但触发器不会触发。
任何想法我做错了什么?
谢谢!
【问题讨论】:
-
除非您设置源对象,否则绑定将不起作用,例如通过将 Window 的 DataContext 设置为自身,或指定 Binding 的 RelativeSource 属性。除此之外,设置 UpdateSourceTrigger 没有任何意义,因为它在这里没有任何作用。
-
最好不要绑定 Tag 属性并在其 Value 上设置 Trigger,而是使用直接绑定到 isAutoStart 属性的 DataTrigger。
-
如果你没有设置DataContext,试试
Tag="{Binding isAutoStart, RelativeSource={RelativeSource AncestorType=Window}}"。 -
我已将 DataContext 设置为
DataContext="{Binding RelativeSource={RelativeSource Self}}",但它仍然无法正常工作,也无法设置 RelativeSource。 -
你必须像前面消息中所说的@Clemens 设置相对源。在这种情况下,Self 表示(矩形而不是窗口)
标签: c# wpf xaml data-binding triggers