2013-05-14 4 views
3

이것은 내 첫 번째 질문이므로 안녕입니다.MVVM 패러다임을 따르는 메뉴 막대를 만드는 가장 좋은 방법은 무엇입니까?

저는 WPF에 익숙하지 않아 과거에 만든 라이브러리 용 GUI를 만들려고했습니다. 응용 프로그램의 메뉴 막대/선/막대를 만들고 싶었는데 Menu 컨트롤을 사용하여이 작업을 수행하는 것이 매우 간단합니다. 그러나 MVVM에 대한 언급을보고이를 조사하여 컬렉션에서 동적으로 메뉴를 만들고 싶다고 결정했습니다. 이것은 잘하고 좋은

, 나는 주제에 대한 자료를 많이 찾아 내 메뉴 아이템에 대해 다음 뷰 모델로 끝났다 :

class MenuItemViewModel 
{ 
    public string Text { get; set; } 
    public ICommand Command { get; set; } 
    public ObservableCollection<MenuItemViewModel> Children 
    { 
     get 
     { 
      return new ObservableCollection<MenuItemViewModel>(children); 
     } 
    } 

    private List<MenuItemViewModel> children; 

    public MenuItemViewModel() 
    { 
     children = new List<MenuItemViewModel>(); 
    } 
} 

그리고 (엑스트라 포함)보기 :

<Window x:Class="GUI.MainWindow" 
    xmlns="" 
    " 
    " 
    Title="HTX-Formler" Height="350" Width="525" 
    WindowStartupLocation="CenterScreen"> 
<Window.Resources> 
    <Style TargetType="{x:Type MenuItem}"> 
     <Setter Property="Header" Value="{Binding Path=Text}"/> 
     <Setter Property="Command" Value="{Binding Path=Command}"/> 
    </Style> 
    <HierarchicalDataTemplate 
    DataType="{x:Type vm:MenuItemViewModel}" 
    ItemsSource="{Binding Path=Children}"> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<DockPanel KeyboardNavigation.TabNavigation="None"> 
    <Menu DockPanel.Dock="Top" ItemsSource="{Binding Path=Children}" /> 
</DockPanel> 
내가 할

는 지금까지 내가 말할 수있는, 바인딩은 괜찮지 만, 무엇이든, 내가 뭘 그렇게도 아무 것도 표시 메뉴를 얻을 수 없습니다.
나는 내가 잘못 ItemsSource를 사용하고 있기 때문에이 느낌, 그래서 나는 다음과 같은 일을 시도 :

class MainWindowViewModel 
{ 
    #region Fields 

    ReadOnlyCollection<MenuItemViewModel> _menuItems; 

    #endregion 

    #region Menu 

    public ReadOnlyCollection<MenuItemViewModel> Children 
    { 
     get 
     { 
      if (_menuItems == null) 
      { 
       List<MenuItemViewModel> menuItems = this.PopulateMenu(); 
       _menuItems = new ReadOnlyCollection<MenuItemViewModel>(menuItems); 
      } 
      return _menuItems; 
     } 
    } 

    List<MenuItemViewModel> PopulateMenu() 
    { 
     return new List<MenuItemViewModel> 
     { 
      new MenuItemViewModel() 
     }; 
    } 

    #endregion 
} 

을하지만 아무 소용. 컬렉션에 Children 속성과 동일한 이름이 있지만 col 이름을 변경한다는 사실을 알고 있습니다. 아무 효과가 없다.

요약

이 방법으로 메뉴 모음을 만들 수있는 가장 좋은 방법은 무엇입니까?
메뉴 컬렉션을 채우는 가장 좋은 방법은 무엇입니까?

영감의 큰 거래는 다음과 같은 소스에서 복용했다 :

예, 링크의 일부는 SO에 있습니다.
아니요, 위의 소스에 내 이해에 내재 된 중요한 부분이 누락되어 있다고 생각하므로 중복 된 질문이라고 생각하지 않습니다. 이것이 어떻게 든 복제 된 것이라면, 누군가 내가 놓친 정보를 지적하면 감사 할 것입니다.

나는이 사소한 것에 대해 사과하고 나의 두뇌를 알기 때문에 그 대답은 아마도 아주 간단 할 것이지만 나는 문자 그대로 지혜의 끝에 이르렀다. 그래서 모든 대답이 인정 될 것이다.

+0

어디에서 메뉴의 DataContext를 설정하고 있습니까? – Whyaduck

+0

@Whyaduck 어디에도 추측하지 못하고 내가 이해하지 못하는 부분은 바운드 컬렉션을 어디에 둘 것인지입니다. DataContext는 코드 숨김 (불량?)이나 뷰의 부모 요소에 지정할 수 있지만 어떤 것을 지정해야할지 모르겠다는 것을 알고 있습니다. – Jonas

+1

당신의 아이템 datatemplate은 디스플레이를위한 TextBlock과 같은 어떤 요소도 가지고 있지 않습니다. – Alan

답변

0

간단한 솔루션 :

public class MainWindow: Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainWindowViewModel(); 
    } 
} 
+0

제가 말했던 것처럼, 이것은 아마도 매우 간단 할 것입니다. 이것은 주제에 하나의 최종 출처가 없을 때 일어나는 일입니다. xaml에 datacontext를 설정했다면 어떻게 할 것입니까? – Jonas

0

당신은 당신의 창 definiton, 예를 들어,이 넣어 XAML에서 전체 윈도우의 DataContext을 설정할 수 있습니다 윈도우의 생성자에서 DataContext을 설정 아래 </Window.Resources> :

<Window.DataContext> 
    <vm:MenuItemViewModel/> 
</Window.DataContext> 
관련 문제