는 가장 좋은 방법은 무엇입에된 이를 구축하는 메뉴를 표시하는 다양한 페이지?

StackOverflow https://stackoverflow.com/questions/1018483

  •  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/}를 사용하여 슬래시를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top