2013-03-21 42 views
3

在我的WPF應用程序中,有一個列表可以從中選擇一個項目。所選項目將顯示在ContentControl中以便進一步交互。根據所選項目的類型(可能有幾個),在ContentControl中使用適當的DataTemplate。到目前爲止,這對於數據處理業務應用程序來說應該沒什麼特別。ContextMenu命令綁定不與數據源一起更新

在每個DataTemplate中,有多個TextBoxes和其他控件將它們的值綁定到ViewModel類的特定屬性。從列表中選擇另一個項目時,所有這些都按預期進行更新。這些按鈕還在ViewModel的正確實例上執行它們的命令。

有一個上下文菜單項也執行一個命令,但這隻適用於第一個選定的項目。當從列表中選擇相同類型的另一個元素時,重新使用已經加載的模板視圖,上下文菜單中的命令將始終在第一個選定的項目上執行。所以綁定不會更新到ViewModel的正確實例。

使菜單項使用正確的ViewModel實例的唯一方法是選擇不同類型的項目,以便將模板更改爲另一個視圖。只有這樣上下文菜單才能正確更新。

爲什麼菜單項命令不會像視圖中的任何其他綁定一樣更新?它在加載時被讀取一次,但從未更新過視圖的生命週期。

回答

4

它不是不更新的Command綁定,它是過時的DataContext。這是一個衆所周知的問題,一旦你知道正確的搜索字詞...

這裏的進一步聯繫的解釋:

http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda

下面是文章的相關部分:

解決方法是菜單的數據上下文明確地綁定到父母的DataContext如下:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, 
    RelativeSource={RelativeSource Self}}"> 

這個神奇的咒語告訴WPF在菜單的數據上下文和它的「放置目標」(即放置目標)之間創建一個永久綁定。父母)數據上下文,甚至在父母的數據上下文發生變化後仍然可以繼續工作。只有當你期望父母的數據上下文在父母的生活期間改變時,你才需要這個咒語。

我以前發現的另一個解決方案是在Opened事件中手動將上下文菜單的DataContext設置爲窗口的DataContext。這需要在代碼隱藏文件中增加C#代碼,並且可能需要適應不同的場景。所以我認爲上面的XAML只有更好。