는 가장 좋은 방법은 무엇입에된 이를 구축하는 메뉴를 표시하는 다양한 페이지?
-
06-07-2019 - |
문제
나를 구축하고 간단한 응용 프로그램된 이 패턴이다.
이 응용 프로그램이 두 가지 주요 부품:
- 메뉴 에
- 콘텐츠 아
탐색 될 것입니다 간단하다:
- 각 메뉴 항목 (예:관리"고객"또는"보고서")에 채우기 컨텐츠 영역 새로운 페이지가 있는 몇 가지 특정 기능
나 하기 전에이 작업을 수행 한 뒤 코드 코드의 뒤에 이벤트를 처리기 메뉴 항목에 대한 모든 페이지 로드 및가 표시되어야 하나되었으로 아동의 StackPanel.이것은,그러나,작동하지 않습니다된 이후에 당신을 원하지 않을 수동으로 충전 StackPanel 그러나 예:표시는"PageItem"개체 DataTemplate,etc.
그래서 당신의 사람들을 만들어 간단한 클릭-메뉴 응용 프로그램을 다음과 같이된 이 무엇이었을 당신의 기본 응용 프로그램 구조는? 나는 생각하고 따라 이러한 라인:
MainView.xaml:
<DockPanel LastChildFill="False">
<Menu
ItemsSource="{Binding PageItemsMainMenu}"
ItemTemplate="{StaticResource MainMenuStyle}"/>
<ContentControl
Content="{Binding SelectedPageItem}"/>
</DockPanel>
어디 메뉴 모음"PageItems"및 DataTemplate 표시하는 제목의 각각"PageItem 개체"헤더의 각 MenuItem.
고 ContentControl 으로 가득 될 것으로 보기/뷰 모델 쌍는 모든 기능을 가지고 있지만,확실하지 않습니다.
해결책
먼저,내 생각을 유지해야 합 코드의 뒤에 이벤트를 처리기 없는 지점을 변화에서 간단한 2 라인 이벤트를 처리하는 복잡한 명령 구동 몬스터를 위한 실용적인 사유(고 말하지 않 testebility,이것은 주요 메뉴 테스트됩니다 모든 시간을 당신은 응용 프로그램을 실행).
지금,당신이 가고 싶은 순수한된 이 경로,당신이해야 할 모든 당신이 그것을 만드 메뉴에 불을 명령하고,첫 번째,일부 자원 섹션을 추가 이타:
<Style x:Key="MenuItemStyle" TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding DataContext.SwitchViewCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
<Setter Property="CommandParameter"
Value="{Binding}"/>
</Style>
이 스타일의 메뉴를 만들 항목에 불합 SwitchViewCommand 에 첨부된 뷰 모델 MenuItem 의 매핑되는 명령으로 매개 변수입니다.
실제의 보기와 같은 코드를 추가 참조 하는 스타일로 ItemContainerStyle(그래서 그것을 적용하는 메뉴 항목과하지 않는 콘텐츠의 DataTemplate):
<DockPanel LastChildFill="False">
<Menu DockPanel.Dock="Top"
ItemsSource="{Binding PageItemsMainMenu}"
ItemTemplate="{StaticResource MainMenuStyle}"
ItemContainerStyle="{StaticResource MenuItemStyle}"/>
<ContentControl
Content="{Binding SelectedPageItem}"/>
</DockPanel>
지금 보기에 필요한 모델(내가 사용하는 문자열이 없기 때문에 당신의 PageItem 코드):
private string _selectedViewItem;
public List<string> PageItemsMainMenu { get; set; }
public string SelectedPageItem
{
get { return _selectedViewItem; }
set { _selectedViewItem = value; OnNotifyPropertyChanged("SelectedPageItem"); }
}
public ICommand SwitchViewCommand { get; set; }
고 사용하는 모든 명령 클래스들을 사용하여 이 명령을 호출 이 코드:
private void DoSwitchViewCommand(object parameter)
{
SelectedPageItem = (string)parameter;
}
지금 할 때,사용자 메뉴 항목을 클릭 메뉴 항목을 호출 SwitchViewCommand 페이지와 함께 항목으로 매개 변수입니다.
명령이 호출 DoSwitchViewCommand 을 설정하는 SelectedPageItem 시설
이 숙박 시설 인상 NotifyPropertyChanged 을 만들 것입니다 UI 업데이트를 통해 데이터 바인딩.
또는,당신은 당신이 작성할 수 있습 2 라인 이벤트 처리기,당신의 선택
다른 팁
VM에서 관측형 수집을 상상할 수 있습니다. 메뉴에서 모든 페이지를 호출 할 수 있습니다. 그런 다음 ItemsControl 및 ContentControl을 바인딩하여 ContentControl이 항상 해당 목록에서 CurrentItem을 표시하도록합니다. 물론 메뉴는 일부 제목 속성에만 바인딩되는 반면 ContentControl은 전체 항목을 채택하고 유형에 따라 적절한보기를 연결합니다.
또 다른 옵션은 메뉴 대신 ListBox를 사용하고 ListBox를 메뉴처럼 보이게 한 다음 다음과 같이 선택한 값에 바인딩하는 것입니다.
<DockPanel LastChildFill="False">
<ListBox
ItemsSource="{Binding PageItemsMainMenu}"
ItemTemplate="{StaticResource MainMenuStyle}"
IsSynchronizedWithCurrentItem="True"/>
<ContentControl
Content="{Binding PageItemsMainMenu/}"/>
</DockPanel>
issynchronizedwithCurrentItem = "true"를 참고하여 선택한 항목을 설정하고 {바인딩 PageItemsMainMenu/}를 사용하여 슬래시를 사용합니다.