从控制器代码定义DataContext

时间:2010-06-22 09:18:38

标签: c# wpf xaml datacontext

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

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 个答案:

答案 0 :(得分:1)

您可以直接在代码中设置数据:

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

        w.DataContext = new Data();

        w.ShowDialog();
    }
}

或者使用Binding,你应该在后面的代码中设置不同的Binding:

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设置为DataContext,这意味着您将不绑定到Data,而是绑定到Binding对象本身。如果您使用Xaml,它会在一定程度上决定您是否使用绑定,并使用后者而不是第一个绑定!

希望这有帮助!