我希望能够访问资源中的父DataContext以在绑定中使用它。这是样本:
<Window x:Class="WpfApplication44.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication44"
x:Name="MyWindows"
Title="MainWindow"
Width="525"
Height="350"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<l:SomeResource x:Key="SomeResource">
<l:SomeResource.Context>
<!--
DataContext is set to windows object.
I want to bind to window`s title property
-->
<Binding Path="Title" />
</l:SomeResource.Context>
</l:SomeResource>
</Window.Resources>
<StackPanel>
<Label>
<StaticResource ResourceKey="SomeResource" />
</Label>
<!-- UPD -->
<TextBlock Text="{Binding Source={StaticResource SomeResource}, Path=Context}" />
</StackPanel>
但我明白了:
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径=标题;的DataItem = NULL; target元素是'SomeResource'(HashCode = 25557385); target属性是'Context'(类型'Object')
SomeResource派生自DependencyObject,只包含一个类型为object的依赖属性Context。
看起来资源无法访问父级的DataContext属性,如果资源属于FrameworkElement类型,则不会设置事件。我试图在绑定中使用ElementName,RelativeSource,但没有运气。
我只需要将父级的DataContext设置为资源。我正在使用MVVM,因此任何MVVM解决方案都是可取的。
UPD 项目链接为here
答案 0 :(得分:0)
哦看起来像DataProxy而不是像这样修改SomeResource
到Freezable
:
public class SomeResource : Freezable
{
protected override Freezable CreateInstanceCore()
{
return new SomeResource();
}
public static readonly DependencyProperty ContextProperty = DependencyProperty.Register("Context", typeof(object), typeof(SomeResource), new PropertyMetadata(default(object)));
public object Context
{
get { return (object)GetValue(ContextProperty); }
set { SetValue(ContextProperty, value); }
}
}