Я рассматривал подобные вопросы здесь, в 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.