Как привязать к свойству собственности в WPF? - PullRequest
0 голосов
/ 19 декабря 2010

Что работает

У меня есть окно с виджетом и такой привязкой:

<Button Name="button" IsEnabled="{Binding Path=CanBeEnabled}"/>

и в коде окна я устанавливаю основной контекст данных и контекст данных для этого виджета:

    public Controller controller { get; set; }

    public WorkflowWindow(Controller con) // constructor
    {
        controller = con;

        InitializeComponent();
        DataContext = this;
        button.DataContext = controller;
    }

Свойство «контроллер» находится в такой простой форме, потому что за время существования окна оно никогда не меняется.

Что не работает

Мне бы хотелосьиметь один контекст данных и использовать вложенную привязку, такую ​​как:

<Button Name="button" IsEnabled="{Binding Path=controller.CanBeEnabled}"/>

и код

    public WorkflowWindow(Controller con)
    {
        controller = con;

        InitializeComponent();
        DataContext = this;
    }

В этом случае виджет всегда отключен.

И небольшие вариациииз этого

    public WorkflowWindow(Controller con)
    {
        controller = con;

        InitializeComponent();
        DataContext = this;
        button.DataContext = this; // directly setting the data context
    }

В этом случае виджет всегда включен (здесь это не опечатка).

Вопрос

Как сделатьвторая форма работает?Я предпочитаю вторую форму, потому что тогда я мог связываться с различными источниками, не только из одного контекста данных.

решено

Том ударил по гвоздю в голову - проблема была из-за вложения- кнопка является частью пользовательского элемента управления, и я дважды настраивал контекст данных.Один раз при определении элемента управления, второй раз при его использовании (как здесь).Вот почему WPF запутался - и я потратил два дня на отслеживание проблемы, о мальчик: - (

1 Ответ

2 голосов
/ 20 декабря 2010

хорошо, вы можете сделать это проще, потому что свойство DataContext является одним из немногих, которые наследуются , что означает, что при установке на элемент где-то в дереве все дочерние элементы получают его неявно, если они не отменяйте это.

Так что код вашего окна может выглядеть примерно так:

public WorkflowWindow(Controller con)
{
   InitializeComponent();
   DataContext = con;
}

и тогда ваша кнопка должна выглядеть так:

<Button IsEnabled="{Binding Path=CanBeEnabled}"/>

так что происходит, когда механизм привязки wpf пытается разрешить свойство CanBeEnabled:

  1. будет смотреть на кнопки DataContext.
  2. кнопка DataContext явно не установлена, но наследуется от окна, в котором находится кнопка (WorkflowWindow).
  3. wpf получит свойство CanBeEnabled от DataContext, которое (как назначено) будет передано в контроллер consttructor окна.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...