2015-10-08 16 views
0

我正在瀏覽代碼,我發現在我的視圖的構造函數中,我將DataContext設置爲我的視圖模型的新實例。進入它,我可以看到設置了字段Thingies。回到視圖的構造函數,我可以驗證視圖模型的屬性是否已設置,並且元素的數量是否正確。數據何時被綁定以及如何加速?

然後......(讓我們回到這個點在第二)

最後,我可以看到呈現的圖形用戶界面,其中由視圖模型產生的數據只是顯示爲應該。一切都按預期完成。現在,我只需要將網格的第一行設置爲選中狀態,這應該不是問題,因爲我知道數據在那裏(通過引入模型視圖的構造函數,觀察數據上下文的字段以及實際窗口的內容)。

但拿去...(現在,讓我們回到上述點)

當我研究了網格的DataItems財產,同時仍然在構造函數中,我發現有一個在它的零個元素。由於我在屏幕上看到了這些,我知道他們必須以某種方式到達,但是,顯然,視圖模型的屬性Thingies發生綁定構造函數的運行後。

我想強制執行綁定發生而仍然在構造函數(如果這是最合適的方法)。作爲計劃B,我正在考慮對某些事件做出反應(例如Blopp_OnDataBound(...)或其他),但除了target being updated之外,我沒有找到任何東西。我已將TargetUpdated =「TheGriddy_OnTargetUpdated」放在數據源綁定旁邊,但該方法不會調用。

注意:儘管我在特定控件上這樣做,但我確信這個問題通常適用於任何控件,因爲它涉及XAML/WPF的數據綁定範例。如我錯了請糾正我。 (我對Infragistics的XamDataGrid但行爲是好的,舊的,普通的DataGrid最有可能reproduceable)

按照要求,我還提供了一個小樣本,這是我選擇了不之前,因爲我認爲這沒有任何幫助。我立場糾正。

public MyView() 
{ 
    InitializeComponent(); 
    DataContext = new MyViewModel(); 

    if (xamDataGrid.DataSource != null) 
    throw new HappyException("yes!"); 
} 

private void SomeMethod() 
{ 
    if (xamDataGrid.DataSource != null) 
    throw new HappyException("yes!"); 
} 

的問題是異常從來沒有在構造函數拋出的,但在方法 。數據源是在我們綁定時設置的,所以綁定必須在構造函數運行後發生,對嗎?

我需要選擇第一行。這可以在第一行存在時完成...

+2

我兩次讀到你的問題,但我仍然無法理解所有複雜情況。我知道這是很多工作,但[mcve](http://stackoverflow.com/help/mcve)在這裏確實有幫助。 – Heinzi

+0

此外,我認爲有一些評論的代碼片段將有助於理解您的問題 - 我們編寫的代碼不是文獻:-) – derape

+0

@Heinzi我已經添加了一些示例。也許這將有助於澄清我的問題。 –

回答

0

當首次顯示窗口時,數據綁定似乎發生在LayoutUpdated事件中。我認爲B計劃是迄今唯一可行的方式。使用How to detect data binding completed in WPF線程中提到的TargetUpdated事件,但請注意,您需要明確地啓用NotifyOnTargetUpdated否則它不會觸發(正如您已經看到的那樣)。

+0

你會怎麼說* TargetUpdated *涉及*加載*(如果我在那裏做相同的東西,當然)?它會不太受歡迎?我只會在用戶在視圖中加載時執行操作,而不是在稍後他們將使用它。 –

+0

@KonradViltersten嗯,你當然可以使用Loaded,但是TargetUpdated IMO更好,因爲它會在每次重新綁定時觸發(如果你這樣做的話)。但如果這就是你所需要的,那麼確定先使用Loaded - TargetUpdated觸發器,然後使用Loaded。 –

相關問題