2014-01-15 113 views
0
<Custom:DataGrid.ContextMenu> 
      <ContextMenu ItemsSource="{Binding MenuItemsList, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 
</Custom:DataGrid.ContextMenu> 

public ObservableCollection<MenuItem> MenuItemsList 
     { 
      get 
      { 
        ObservableCollection<MenuItemClass> list = new ObservableCollection<MenuItemClass>(); 
       if (SelectedInspection != null) 
       { 
        switch (SelectedInspection.state.s_serverid) 
        { 
         case 1: 
         case 2: 
          list.Add(medit); 
          break; 
         case 3: 
          list.Add(msync); 
          list.Add(mview); 
          list.Add(mnewdoc); 
          break; 
         case 4: 
          list.Add(mview); 
          list.Add(mdelete); 
          break; 
        } 
       } 
       return list; 
      } 
      set 
      { 
       OnPropertyChanged("MenuItemsList"); 
      } 
     } 

ContextMenu(CM)位於UserControl 1(UC1)中。 窗口有2個用戶控件和主菜單來選擇這個控件。WPF MVVM Dynamic ContextMenu

選擇UC1
使用CM - OK
選擇UC2
選擇UC1
使用CM - OK


選擇UC1
使用CM - OK
選擇UC1
使用CM - 不更新CM物品

I認爲我應該在創建UC1的新視圖模型時更新UC1的視圖,但是如何? 或者可能是我應該重寫ContextMenu的實現?

+2

只是一個小的信息:你不應該與UIElement的類型,來創建ObservableCollections。你應該在這裏使用一個持有你的商業邏輯的對象。 – Tomtom

+0

@Tomtom你的意思是「自己的類」,例如? – Risa

+0

是的,這就是我的意思 – Tomtom

回答

0

好的。

首先:

getter中的代碼應該移入模型中。

現在您的問題:

你的二傳手應該像

set 
{ 
    this.MenuItemsList = value; 
    OnPropertyChanged("MenuItemsList"); 
} 
+0

在得到只有返回列表= GetMenu(); ? – Risa

+0

通常在MVVM中,每個屬性都有一個後端字段。該屬性然後設置/獲取後端字段並在設置器中觸發OnPropertyChanged – Tomtom

+0

我知道它,但是如果我將它寫在set上,那麼set將被調用? – Risa