2010-06-22 42 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