이것은 내 첫 번째 질문이므로 안녕입니다.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에 있습니다.아니요, 위의 소스에 내 이해에 내재 된 중요한 부분이 누락되어 있다고 생각하므로 중복 된 질문이라고 생각하지 않습니다. 이것이 어떻게 든 복제 된 것이라면, 누군가 내가 놓친 정보를 지적하면 감사 할 것입니다.
나는이 사소한 것에 대해 사과하고 나의 두뇌를 알기 때문에 그 대답은 아마도 아주 간단 할 것이지만 나는 문자 그대로 지혜의 끝에 이르렀다. 그래서 모든 대답이 인정 될 것이다.
어디에서 메뉴의 DataContext를 설정하고 있습니까? – Whyaduck
@Whyaduck 어디에도 추측하지 못하고 내가 이해하지 못하는 부분은 바운드 컬렉션을 어디에 둘 것인지입니다. DataContext는 코드 숨김 (불량?)이나 뷰의 부모 요소에 지정할 수 있지만 어떤 것을 지정해야할지 모르겠다는 것을 알고 있습니다. – Jonas
당신의 아이템 datatemplate은 디스플레이를위한 TextBlock과 같은 어떤 요소도 가지고 있지 않습니다. – Alan