从控制器代码中定义DataContext
问题描述:
我希望从外部类定义我的窗口的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
属性必须从不同的线程设置?
答
你可以在你的代码中直接设置数据的背后:
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,它将通常确定您是否使用绑定,并使用后者而不是第一个!
希望这会有所帮助!
是的,它的工作!所以如果我理解正确,当我使用'DataContext = someObject'语法时,DataContext属性会自动为我的someObject实例化一个Binding对象? – slaphappy 2010-06-22 09:33:54
不,它只是直接设置对象。当您使用绑定和属性的路径时,它将注册更改。使用绑定到一个对象,而不是一个对象的属性是非常无用的;该对象将永远不会改变,所以您将永远不需要注册更改,因此您不需要绑定到直接对象! – Arcturus 2010-06-22 09:54:04