Пользовательское присоединенное свойство WPF в DataTrigger

Я просмотрел подобные вопросы здесь, на SO, и не смог найти решение, поэтому вот моя сделка:

** Имею следующий класс: **

public static class ControlSecurity
{
    public static readonly DependencyProperty IsSecuredProperty =
        DependencyProperty.RegisterAttached(
            "IsSecured",
            typeof (bool),
            typeof (FrameworkElement),
            new PropertyMetadata(false));

    [AttachedPropertyBrowsableForType(typeof(Control))]
    public static bool GetIsSecured(FrameworkElement ctl)
    {
        return (bool)ctl.GetValue(IsSecuredProperty);
    }

    public static void SetIsSecured(FrameworkElement ctl, bool value)
    {
        ctl.SetValue(IsSecuredProperty, value);
    }
}

Как вы можете догадаться, он добавляет Security:ControlSecurity.IsSecured ко всем FrameworkElement.

Примечание. Security: указывает на пространство имен, в котором находятся все эти классы (включая ControlSecurity)

Итак, я реализовал этот шаблон данных и стиль для одного из моих элементов управления:

       <DataTemplate x:Key="SecureButtonTemplate">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="SecureIcon" Source="pack://application:,,,/Resources/Icons/secure.png" Width="16" Height="16" Visibility="Collapsed" />
                <ContentPresenter Content="{Binding}" />
            </StackPanel>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Security:ControlSecurity.IsSecured}" Value="true">
                    <Setter TargetName="SecureIcon" Property="Visibility" Value="Visible" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
        <Style TargetType="{x:Type Button}">
            <Setter Property="ContentTemplate" Value="{StaticResource SecureButtonTemplate}" />
        </Style>

Проблема здесь заключается в привязке к DataTrigger:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Security:ControlSecurity.IsSecured}

Идея в том, что я хочу найти родительскую кнопку и привязать ее к Security:ControlSecurity.IsSecured присоединенному свойству, которое я определил.

Я пробовал около 10 различных вариантов этой привязки, и я продолжаю получать ошибку привязки примерно так:

System.Windows.Data Error: 40 : BindingExpression path error: 'Security:ControlSecurity' property not found on 'object' ''Button' (Name='')'. BindingExpression:Path=Security:ControlSecurity.IsSecured; DataItem='Button' (Name=''); target element is 'ContentPresenter' (Name=''); target property is 'NoTarget' (type 'Object')

На данный момент я в тупике, и мне бы хотелось получить некоторую информацию от гуру WPF.


person Aren    schedule 18.08.2010    source источник


Ответы (1)


Просто добавьте скобки:

Path=(Security:ControlSecurity.IsSecured)
person Thomas Levesque    schedule 18.08.2010
comment
Хорошо, я сделал это, теперь я получаю исключение XAML Parse Exception с внутренним исключением, в котором говорится: путь к свойству недействителен. «ControlSecurity» не имеет общедоступного свойства с именем «IsSecured». - person Aren; 18.08.2010
comment
Не обращайте внимания на мой комментарий выше. Я понял, что в моем прикрепленном свойстве был указан неправильный владелец. - person Aren; 18.08.2010
comment
Сладкое что-то религиозное, от этого у меня голова закружилась. Спасибо. - person MrEdmundo; 25.07.2013