Привязка к свойству пользовательского элемента управления - PullRequest
0 голосов
/ 02 октября 2011

Я занимаюсь разработкой раскрывающегося списка учетных записей, который будет использоваться в моем приложении.В раскрывающемся списке будет выполнен вызов службы и получен список доступных учетных записей, а в раскрывающемся списке будет отображено свойство «Выбранная учетная запись» для выбранного элемента.SelectedAccount будет DependencyProperty, так как он должен быть связан с потребителями элемента управления AccountDropdown, и он должен быть двухсторонним, чтобы связать его, чтобы он отражал существующий SelectedAccount., он содержит ComboBox:

<ComboBox SelectedItem="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"...

Выбранный элемент поля со списком привязан к свойству, которое зарегистрировано как

DependencyProperty.Register("SelectedAccount", typeof(IAccount), typeof(AccountDropdown),
                                new UIPropertyMetadata(null));

... и обычному свойству:

    #region SelectedAccount

    /// <summary>
    /// Selected account
    /// </summary>
    public IAccount SelectedAccount
    {
        get { return (IAccount)GetValue(SelectedAccountProperty); }
        set { SetValue(SelectedAccountProperty, value); }
    }
    #endregion SelectedAccount

Свойства определены в файле code-behind ... и контекст данных установлен на "this" ... поэтому привязка установлена ​​правильно.

Когда я используюДля этого элемента управления мне нужно привязать SelectedAccount к свойству ViewModel для другого представления, например:

<Controls:AccountDropdown SelectedAccount="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

Когда я запускаю приведенный выше код и меняю выбор в раскрывающемся списке, я получаю СистемуИсключение .StackOverflow.Я даже не могу его отладить, исключение выдается из Windows.Base.dll.

Я боролся с этим уже целый день ... любая помощь будет признательна.

** Примечание: ** Я написал несколько элементов управления WPF со свойствами зависимости, и они отлично работают, но когда я их использую, я предоставляю значение явно в файле .asmx.В этом случае я снова связываюсь, когда использую свойство.Я предполагаю, что для раскрытия привязываемого свойства может потребоваться дополнительная хитрость.

Ответы [ 2 ]

1 голос
/ 02 октября 2011

Хорошо, как это часто бывает, решение было простым.DataContext элемента управления AccountDropdown неявно устанавливался для себя, отсюда и бесконечный цикл.Просто указав DataContext для использования DataContext элемента управления, в котором он использовался (и, следовательно, используя предполагаемую привязку ViewModel):

<Controls:AccountDropdown DataContext="{Binding}" SelectedAccount="{Binding Path=SelectedAccount, Mode=TwoWay}" />

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

Еще раз спасибо тем, кто ответил.

0 голосов
/ 02 октября 2011

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

Для тестирования: удалите SelectedAccountChanged из вызова DependencyProperty.Register, чтобы убедиться, что это источники ошибки, а затем проверьте сам метод..

...