绑定到父DataContext

时间:2015-05-04 08:26:01

标签: c# .net wpf xaml

我希望能够访问资源中的父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

1 个答案:

答案 0 :(得分:0)

哦看起来像DataProxy而不是像这样修改SomeResourceFreezable

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); }
    }
}