2014-01-15 5 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 동적 컨텍스트 메뉴

선택 UC1
사용 CM -
선택 UC2
선택 UC1
사용 CM OK - 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

을 업데이트했습니다. shoul을 (를) 얻으려면 return list = GetMenu(); ? – Risa

+0

일반적으로 MVVM에는 각 속성에 대한 백엔드 필드가 있습니다. 그런 다음 속성은 setend에서 백엔드 필드를 설정/가져오고 OnPropertyChanged를 발생합니다. – Tomtom

+0

알지만 설정에 쓰면 설정이 호출됩니다. – Risa

관련 문제