Получение значения привязки WPF RelativeSource в codebehind - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь перевести этот код XAML:

<Binding Path="DataContext" RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}" />

В этот C# код:

var binding = new Binding("DataContext")
{
    RelativeSource = new RelativeSource {AncestorType = typeof(UserControl)}
};
var value = PropertyPathHelper.GetValue(binding);

Реализация моего PropertyPathHelper (изменено с другого thread ) класс выглядит следующим образом:

public static class PropertyPathHelper
{
    public static object GetValue(Binding binding)
    {

        BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, binding);
        return _dummy.GetValue(Dummy.ValueProperty);
    }

    private static readonly Dummy _dummy = new Dummy();

    private class Dummy : DependencyObject
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null));
    }
}

Либо мое объявление Binding неверно, либо моя реализация PropertyPathHelper неверна, но я не знаю, какой, потому что во время выполнения " var value "выходит как ноль. Даже если я передам несуществующее имя в конструктор Binding.

Привязка работает нормально, если я делаю это в XAML, но у меня есть , чтобы сделать это в коде позади. В случае, если неясно, я пытаюсь получить фактическое значение DataContext первого предка этого представления, который имеет тип UserControl.

Что я делаю неправильно?

1 Ответ

0 голосов
/ 16 апреля 2020

Я нашел гораздо более элегантный способ достижения своих целей ... и он действительно работает.

Во-первых, в моем XAML я добавил следующий атрибут:

Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"

Тогда я обнаружил, что могу просто взять то, что мне нужно, с помощью следующего кода в коде:

var v = this.Tag as FrameworkElement;
var vm = v.DataContext as MyViewModel; //The ViewModel of the parent view, not the current one

Спасибо за ваши вопросы, @Clemens. Обходным путем вы помогли мне по-другому взглянуть на мою проблему!

...