在代码隐藏中获取 WPF RelativeSource 绑定的值

Getting the value of a WPF RelativeSource binding in codebehind

我正在尝试翻译这段 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(修改自another thread)class的实现如下:

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" 输出为 null。即使我将一个不存在的名称传递给 Binding 的构造函数。

如果我在 XAML 中进行绑定,绑定工作正常,但我 必须 在代码隐藏中进行绑定。如果不清楚,我正在尝试获取此视图的第一个祖先的 DataContext 的实际 value,其类型为 UserControl。

我做错了什么?

我找到了一种更优雅的方式来实现我的目标......而且它确实有效。

首先,在我的视图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。迂回曲折,你帮我换个角度思考问题!