在代码隐藏中获取 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。迂回曲折,你帮我换个角度思考问题!
我正在尝试翻译这段 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。迂回曲折,你帮我换个角度思考问题!