WPF DataTrigger не запускается за пределами ItemsControl - PullRequest
1 голос
/ 01 марта 2010

У меня есть Custom UserControl, который расширяет элемент управления кнопки и добавляет два новых свойства зависимости IsActive и Icon. В элементе управления есть DataTriggers, которые устанавливают значок и активное состояние в зависимости от значения.

У меня проблема в том, что элемент управления работает только внутри 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 Ответ

1 голос
/ 02 марта 2010

Это не совсем ясно из включенного XAML, так как вы не показываете, где x: Name = "MyFunctionButton" объявляется или где используется триггер, но я предполагаю, что у вас возникла проблема с ограничением имен. Вместо использования ElementName вы должны использовать привязку RelativeSource (TemplatedParent или Self в зависимости от того, где находится триггер) или свойство Trigger вместо DataTrigger. Если вы можете включить больше XAML в свой DataTrigger для обеспечения некоторого контекста, я могу дать вам более точный ответ с некоторым кодом.

...