我查看了很多主题,但它们都以某种方式与 UI 元素的 DataContext 的定义有关。
我有一项任务需要完全不同的方法。不管我对这个决定有多么困惑,我什么都想不起来。
问题描述。
最初,有一个简单的代理:
using System;
using System.Windows;
namespace Proxy
{
/// <summary> Provides a <see cref="DependencyObject"/> proxy with
/// one property and an event notifying about its change. </summary>
public class Proxy : Freezable
{
/// <summary> Property for setting external bindings. </summary>
public object Value
{
get { return (object)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
// Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register(nameof(Value), typeof(object), typeof(Proxy), new PropertyMetadata(null));
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
}
}
如果你在任何元素的 Resources 中设置它,那么它可以通过一个简单的 Binding 获取 DataContext:
<FrameworkElement.Resources>
<proxy:ProxyValue x:Key="proxy"
Value="{Binding}"/>
</FrameworkElement.Resources>
同样,任何没有明确指定源的 Bindig 都将使用其资源中的代理实例被声明为源的元素的 DataContext。
子代理注入。
现在,对于某个任务(它的条件与问题无关,所以我不会描述它)我需要一个嵌套(子)代理,它也可以分配一个相对于数据上下文的绑定。
我需要在代码中设置这个绑定。
一个高度简化的演示示例:
using System.Windows.Data;
namespace Proxy
{
public class PregnantProxy : Proxy
{
public Proxy Child { get; } = new Proxy();
public PregnantProxy()
{
Binding binding = new Binding();
BindingOperations.SetBinding(this, ValueProperty, binding);
BindingOperations.SetBinding(Child, ValueProperty, binding);
}
}
}
<StackPanel DataContext="Some data">
<FrameworkElement.Resources>
<proxy:PregnantProxy x:Key="proxy"/>
</FrameworkElement.Resources>
<TextBlock Text="{Binding}" Margin="10"/>
<TextBlock Text="{Binding Value, Source={StaticResource proxy}}" Margin="10"/>
<TextBlock Text="{Binding Child.Value, Source={StaticResource proxy}}" Margin="10"/>
</StackPanel>
父代理绑定按预期工作。
但是链接一个孩子不会返回任何东西。
如何为孩子设置正确的绑定?