2015-06-22 70 views
4

我通常在codebehind中實例化ViewModel,並將其設置爲Window或UserControl的DataContext。在XAML中設置代碼時訪問DataContext實例

對於這個簡單的視圖模型:

public class ViewModel 
{ 
    public ObservableCollection<string> items { get; set; } 

    public ViewModel() 
    { 
     items = new ObservableCollection<string>(); 
     items.Add("FirstItem"); 
     items.Add("SecondItem"); 
     items.Add("ThirdItem"); 
    } 
} 

我加入我的本地命名空間和下面的語法將設置正確的事情:

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 

很好,我明白,一個視圖模型對象實例化和爲窗口設置爲DataContext,它按預期工作,但有什麼辦法從代碼訪問實例化的對象?

如果我創建

ViewModel vm = new VewModel(); 
this.DataContext = vm; 

在代碼隱藏的對象,我能夠訪問虛擬機實例,但與XAML的做法,又怎能達到?

我已經創建了這個小例子,以瞭解是否有簡單的答案可用。

回答

6

當您設置DataContext任何元素,那麼所有所述元件的孩子也會有同樣的DataContext

圖片的情景:

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 

在這裏,你已經給了Window一個DataContext。現在,窗口中的所有子元素都有相同的DataContext

<TextBox Text="{Binding MyProperty}" /> 

要獲得DataContext的保持在後臺代碼,你可以簡單地引用元素的DataContext

ViewModel vm = (ViewModel)this.DataContext; 

上述代碼引用WindowDataContext

如果您需要更具體一些,並獲得特定元素的DataContext,那麼您可以簡單地通過名稱引用該元素。

ViewModel vm = (ViewModel)elementName.DataContext; 

所有這一切不談,你應該永遠設置DataContext代碼隱藏。 MVVM設計模式喜歡將事物分開,並且如果您開始設置例如UserControl,那麼情況就會變得非常快。

在XAML中設置DataContext是正確的選擇。

+1

+1,但是在XAML中設置'DataContext'並不總是正確的。例如,如果您的ViewModel是通過View的構造函數注入的,那麼將其設置爲代碼隱藏是正確的方法。 – almulo

相關問題