WPF DataTrigger不在ItemsControl之外触发

时间:2010-03-01 19:16:06

标签: wpf datatrigger

我有一个自定义UserControl,它扩展了按钮控件,并添加了两个新的依赖项,即IsActive和Icon。在控件中有DataTriggers,它根据值设置Icon和Active状态。

我遇到的问题是控件只能在ItemControl内部工作。这是项目控件内外控件的XAML部分。当控件不在项目控件中时,触发器不起作用。

<ItemsControl ItemsSource="{Binding HomeList}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Controls:FunctionButton IsActive="True" Foreground="White" Content="Home" Icon="Home" Command="{Binding HomeClick}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
</ItemsControl>
<Controls:FunctionButton IsActive="True" Foreground="White" Content="Home" Icon="Home" Command="{Binding HomeClick}" />

这是控件中的DataTrigger。

 <DataTrigger Binding="{Binding ElementName=MyFunctionButton, Path=Icon}" Value="Home">
       <Setter TargetName="HomeIcon" Property="Visibility" Value="Visible" />
 </DataTrigger>

唯一不起作用的属性是我的依赖属性。

    public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register("IsActive", typeof(bool), typeof(FunctionButton));
 public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof (Icon), typeof (FunctionButton));

 /// <summary>
    /// Gets or sets a value indicating whether this instance is active.
    /// </summary>
    /// <value><c>true</c> if this instance is active; otherwise, <c>false</c>.</value>
 public bool IsActive
 {
     get
     {
         return (bool) base.GetValue(IsActiveProperty);
     }
        set
        {
            base.SetValue(IsActiveProperty, value);
        }
 }

    /// <summary>
    /// Gets or sets the icon.
    /// </summary>
    /// <value>The icon.</value>
 public Icon Icon
 {
     get
     {
         return (Icon) base.GetValue(IconProperty);
     }
        set
        {
            base.SetValue(IconProperty, value);
        }
 }    

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

从包含的XAML中可以清楚地看出,因为你没有显示x:Name =“MyFunctionButton”被声明的地方或使用触发器的地方,但我认为你遇到了名称范围问题。您应该使用RelativeSource绑定(TemplatedParent或Self取决于触发器的位置)或属性Trigger而不是DataTrigger,而不是使用ElementName。如果你可以在DataTrigger周围包含更多XAML来提供一些上下文,我可以用一些代码给你一个更精确的答案。