2015-05-04 2 views
0

Я хочу иметь доступ к родительскому DataContext в ресурсе, чтобы использовать его в привязке. Вот пример:Ресурс со связыванием с родителем 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 Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Title; DataItem=null; target element is 'SomeResource' (HashCode=25557385); target property is 'Context' (type 'Object')

SomeResource является производным от DependencyObject и содержит только один зависимостях свойство контекста объекта типа.

Похоже, что ресурсы не имеют доступа к свойству DataContext родителя и не установлены событие, если ресурс имеет тип FrameworkElement. Я пытался использовать ElementName, RelativeSource в моей привязке, но не повезло.

Все, что мне нужно - это установить родительский DataContext для ресурсов. Я использую MVVM, поэтому любые решения MVVM предпочтительнее.

UPD Ссылка проекта here

+0

Это отлично работает для меня. Pls предоставляет код «Window» и «SomeResource» тоже! – sac1

+0

Привет, @ sac1, вот ссылка на полный проект: http://1drv.ms/1brwkVZ. Вы использовали именно мой код? спасибо – aderesh

ответ

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

Спасибо, это работает. Я попробовал это, прежде чем публиковать этот вопрос, но, может быть, я что-то пропустил. – aderesh