2012-01-23 3 views
-1

У меня есть тестовое окно WPF, в этом окне я объявляю ресурс окна, и я хочу привязать datacontext окна к свойству зависимости этого ресурса. Вот мой пример:Привязка элементов окна к свойствам ресурса

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 

     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
     > 

    <Window.Resources> 
     <local:TestObj x:Key="MyResObj" Target="{Binding DataContext, diagnostics:PresentationTraceSources.TraceLevel=High}" /> 
    </Window.Resources> 

    <Grid> 
     <TextBox Tag="{StaticResource MyResObj}" /> 
    </Grid> 
</Window> 

и код позади:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     this.DataContext = this; 

     InitializeComponent(); 
    } 
} 

и вот мой TestObj:

namespace WpfApplication1 
{ 
    public class TestObj : DependencyObject 
    { 

     public static readonly DependencyProperty TargetProperty = DependencyProperty.Register("Target", typeof(object), typeof(TestObj)); 

     public object Target 
     { 
      get { return this.GetValue(TargetProperty); } 
      set { SetValue(TargetProperty, value); } 
     } 

    } 
} 

это упрощенный пример, который я хочу, чтобы в конечном счете связывать более сложные вещи из окна в элементы, объявленные в разделе Window.Resources. В настоящее время это не работает, как я ожидал, что так я включил многословным связывание протоколирования - ошибка связывания я получаю

System.Windows.Data Warning: 54 : Created BindingExpression (hash=38018250) for Binding (hash=40782967)
System.Windows.Data Warning: 56 : Path: 'DataContext'
System.Windows.Data Warning: 58 : BindingExpression (hash=38018250): Default mode resolved to OneWay
System.Windows.Data Warning: 59 : BindingExpression (hash=38018250): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 60 : BindingExpression (hash=38018250): Attach to WpfApplication16.TestObj.Target (hash=39268741)
System.Windows.Data Warning: 62 : BindingExpression (hash=38018250): Use Framework mentor
System.Windows.Data Warning: 65 : BindingExpression (hash=38018250): Resolving source
System.Windows.Data Warning: 67 : BindingExpression (hash=38018250): Framework mentor not found
System.Windows.Data Warning: 63 : BindingExpression (hash=38018250): Resolve source deferred
'WpfApplication16.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero.dll'
System.Windows.Data Warning: 65 : BindingExpression (hash=38018250): Resolving source
System.Windows.Data Warning: 67 : BindingExpression (hash=38018250): Framework mentor not found
System.Windows.Data Warning: 65 : BindingExpression (hash=38018250): Resolving source (last chance)
System.Windows.Data Warning: 67 : BindingExpression (hash=38018250): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=DataContext; DataItem=null; target element is 'TestObj' (HashCode=39268741); target property is 'Target' (type 'Object')

Возможно ли это связать окна элементов к ресурсам, как это? Или я сделал ошибку с моей привязкой?

Спасибо!

ответ

0

Я не думаю, что вы можете привязываться к корневому объекту в своих собственных ресурсах (но не цитируйте меня на нем). Можете ли вы попробовать привязать к нему дочернюю сетку?

<Grid> 
    <Grid.Resources> 
     <local:TestObj x:Key="MyResObj" Target="{Binding DataContext, diagnostics:PresentationTraceSources.TraceLevel=High}" /> 
    </Grid.Resources> 
    <TextBox Tag="{StaticResource MyResObj}" /> 
</Grid> 

Я не уверен, что ресурсы даже знают о логическом дереве, хотя:/

+0

К сожалению, это не работает, он имеет те же обязательные ошибки. В конечном итоге TestObj будет объектом ICommand, который может использовать элементы, не входящие в визуальное дерево (например, элементы контекстного меню), поэтому я пытаюсь привязать к нему элементы окна. – kimewaza

+0

Почему вы не можете просто установить тег в DataContext и получить доступ к этому из контекстного меню? – GazTheDestroyer

Смежные вопросы