Привязка данных присоединенного свойства WPF - PullRequest
58 голосов
/ 29 апреля 2011

Я пытаюсь использовать привязку с прикрепленным свойством. Но не могу заставить его работать.

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')

Ответы [ 3 ]

152 голосов
/ 29 апреля 2011

Хотите верьте, хотите нет, просто добавьте Path= и используйте скобки при привязке к присоединенному свойству:

IsChecked="{Binding Path=(local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}"

Кроме того, ваш вызов RegisterAttached должен пройти в «Test» в качестве имени свойства, а не «TestProperty».

18 голосов
/ 12 апреля 2013

Я бы предпочел опубликовать это как комментарий к ответу Кента, но, поскольку у меня недостаточно представителей, чтобы сделать это ... просто хотел бы отметить, что с WPF 4.5 добавление Path= не является необходимо больше. Однако имя присоединенного свойства все еще необходимо заключить в скобки.

0 голосов
/ 10 января 2019

Установка кронштейна работает. Мне пришлось сделать привязку идентификатора автоматизации родительского contentcontrol к textblock в datatemplate Идентификатор автоматизации является вложенным свойством.

Я поставил свойство в скобках и переплет работал.

AutomationProperties.AutomationId="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=(AutomationProperties.AutomationId)}" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...