Связанное с WPF привязка данных свойств
Я пытаюсь использовать привязку с прикрепленным свойством. Но он не может заставить его работать.
public class Attached
{
public static DependencyProperty TestProperty =
DependencyProperty.RegisterAttached("TestProperty", typeof(bool), typeof(Attached),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Inherits));
public static bool GetTest(DependencyObject obj)
{
return (bool)obj.GetValue(TestProperty);
}
public static void SetTest(DependencyObject obj, bool value)
{
obj.SetValue(TestProperty, value);
}
}
Код XAML:
<Window ...>
<StackPanel local:Attached.Test="true" x:Name="f">
<CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}" />
<CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay}" />
</StackPanel>
</Window>
И ошибка привязки:
System.Windows.Data Error: 40 : BindingExpression path error: '(local:Attached.Test)' property not found on 'object' ''StackPanel' (Name='f')'. BindingExpression:Path=(local:Attached.Test); DataItem='StackPanel' (Name='f'); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')
Ответы
Ответ 1
Верьте или нет, просто добавьте Path=
и используйте скобки при привязке к прикрепленному свойству:
IsChecked="{Binding Path=(local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}"
Кроме того, ваш вызов RegisterAttached
должен пройти в "Тест" в качестве имени свойства, а не "TestProperty".
Ответ 2
Я бы предпочел опубликовать это как комментарий к ответу Кента, но, поскольку у меня нет достаточного количества повторений, просто хочу указать, что с WPF 4.5 добавление Path=
не является необходимо больше. Однако имя прикрепленного свойства все равно должно быть заключено в круглые скобки.
Ответ 3
Установка кронштейна работает. Я должен был сделать идентификатор автоматизации связывания родительского contentcontrol
к textblock
в datatemplate
. Идентификатор автоматизации является вложенным свойством.
Я поставил свойство в скобках и переплет работал.
AutomationProperties.AutomationId="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=(AutomationProperties.AutomationId)}"