2010-06-22 43 views
0

我希望从外部类定义我的窗口的DataContext,以便能够将DI用于我的数据模型。 我已经阅读了一些关于它的教程,但我仍然无法让它一起工作。假设我们有一个简单的数据模型:从控制器代码中定义DataContext

class Data 
{ 
    public String Value { get; set; } 

    public Data() 
    { 
     Value = "Test"; 
    } 
} 

当我实例化数据对象为XAML代码,数据绑定正确操作:

<Window ...> 
    <Window.Resources> 
    <src:Data x:Key="data" /> 
    </Window.Resources> 
    <Window.DataContext> 
    <Binding Source="{StaticResource ResourceKey=data}" /> 
    </Window.DataContext> 
    <Grid> 
    <Label Content="{Binding Path=Value}" /> 
    </Grid> 
</Window> 

但是,如果我尝试将数据从外部绑定类,窗口只显示什么,我没有错误:

<Window ...> 
    <Grid> 
    <Label Content="{Binding Path=Value}" /> 
    </Grid> 
</Window> 

和主类:

class Test 
{ 
    [@STAThreadAttribute()] 
    public static void Main(string[] args) 
    { 
     MainWindow w = new MainWindow(); 

     Binding b = new Binding(); 
     b.Source = new Data(); 
     w.DataContext = b; 

     w.ShowDialog(); 
    } 
} 

我错过了什么吗?也许DataContext属性必须从不同的线程设置?

回答

1

你可以在你的代码中直接设置数据的背后:

class Test 
{ 
    [@STAThreadAttribute()] 
    public static void Main(string[] args) 
    { 
     MainWindow w = new MainWindow(); 

     w.DataContext = new Data(); 

     w.ShowDialog(); 
    } 
} 

或者使用绑定的,你应该在代码中不同的设置绑定背后:

class Test 
{ 
    [@STAThreadAttribute()] 
    public static void Main(string[] args) 
    { 
     MainWindow w = new MainWindow(); 

     Binding b = new Binding(); 
     b.Source = new Data(); 
     SetBinding(DataContextProperty, b); 

     w.ShowDialog(); 
    } 
} 
在你的榜样

设置Binding as DataContext,这意味着你将不绑定数据,而是绑定到绑定对象本身。如果您使用Xaml,它将通常确定您是否使用绑定,并使用后者而不是第一个!

希望这会有所帮助!

+0

是的,它的工作!所以如果我理解正确,当我使用'DataContext = someObject'语法时,DataContext属性会自动为我的someObject实例化一个Binding对象? – slaphappy 2010-06-22 09:33:54

+1

不,它只是直接设置对象。当您使用绑定和属性的路径时,它将注册更改。使用绑定到一个对象,而不是一个对象的属性是非常无用的;该对象将永远不会改变,所以您将永远不需要注册更改,因此您不需要绑定到直接对象! – Arcturus 2010-06-22 09:54:04