source

WPF MVVM 탐색 뷰

ittop 2023. 4. 12. 22:58
반응형

WPF MVVM 탐색 뷰

여러 뷰가 있는 WPF 어플리케이션이 있습니다.보기 1에서 보기 2로 전환하고 여러 보기로 전환할 수 있습니다.그래서 같은 창에 view2를 로드하는 view1의 버튼을 원합니다.

나는 그것들을 시도해 보았지만, 효과가 없다.

첫 번째 링크부터 View Model Locator 코드를 이해하지 못하는 것이 문제입니다.그들은 그것을CreateMain();이 기능은 어디에 정의되어 있으며 뷰 내부에서 다른 뷰로 전환하려면 어떻게 해야 합니까?

첫째, MVVM을 구현하기 위해 이러한 툴킷/프레임워크가 필요하지 않습니다.이렇게 간단할 수 있어요예를 들어, 이 데이터에는MainViewModel,그리고.PersonViewModel및 aCompanyViewModel, 각각 관련 뷰가 있고 각각 확장되어 있습니다.abstract베이스 클래스BaseViewModel.

BaseViewModel, 공통 속성을 추가할 수 있습니다.ICommand인스턴스 및 구현INotifyPropertyChanged인터페이스입니다.이 모든 것이 확장되고 있기 때문에BaseViewModel클래스, 우리는 이 속성을MainViewModel모든 뷰 모델로 설정할 수 있는 클래스:

public BaseViewModel ViewModel { get; set; }

물론 이 기능을 구현하고 있을 것입니다.INotifyPropertyChanged이 빠른 예시와 달리 사용자의 속성에서 올바르게 인터페이스할 수 있습니다.자, 들어가겠습니다.App.xaml심플함을 선언합니다.DataTemplates: 뷰를 뷰 모델과 연결합니다.

<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:PersonViewModel}">
    <Views:PersonView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:CompanyViewModel}">
    <Views:CompanyView />
</DataTemplate>

이제, 우리가 사용하는 곳 중 하나가BaseViewModel어플리케이션의 인스턴스,DataTemplate대신 관련 뷰를 표시하도록 프레임워크에 지시합니다.다음과 같이 표시할 수 있습니다.

<ContentControl Content="{Binding ViewModel}" />

새로운 뷰로 전환하기 위해 지금 해야 할 일은,ViewModel로부터의 재산MainViewModel클래스:

ViewModel = new PersonViewModel();

마지막으로 다른 뷰에서 뷰를 변경하려면 어떻게 해야 합니까?몇 가지 가능한 방법이 있지만 가장 쉬운 방법은 v-in-in-in-in-in-in-in-in-in-in-in-in-in-inBinding아이 뷰에서 직접ICommand에서MainViewModel커스텀 버전을 사용하고 있습니다.RelayComand하지만 원하는 타입을 사용할 수 있기 때문에 다음과 같은 그림을 얻을 수 있을 것입니다.

public ICommand DisplayPersonView
{
    get { return new ActionCommand(action => ViewModel = new PersonViewModel(), 
        canExecute => !IsViewModelOfType<Person>()); }
}

자 보기 XAML에서 다음을 수행합니다.

<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
    {RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />

바로 그거야!즐거운 시간 되세요.

MVVM을 처음 시작했을 때는 다른 MVVM-프레임워크, 특히 내비게이션 부분에서도 어려움을 겪었습니다.그래서 레이첼 임이 만든 이 작은 튜토리얼을 사용합니다.그것은 매우 좋고 설명이 잘 되어 있다.

다음 링크에서 확인하십시오.

도움이 되셨기를 바랍니다:)

아마 이 링크가 도움이 될 거예요.설정만 하면 됩니다.NavigateTo속성을 창에 표시해야 하는 뷰에 추가합니다.

예를 들어 다음과 같은 작업을 수행할 수 있습니다.

<Window x:Class="MainWindowView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                                 xmlns:meffed="http:\\www.codeplex.com\MEFedMVVM"
                                 meffed:ViewModelLocator.NonSharedViewModel="YourViewModel"
                                 WindowStartupLocation="CenterScreen">

    <Button meffed:NavigationExtensions.NavigateTo="firstview"
                    meffed:NavigationExtensions.NavigationHost="{Binding ElementName=_viewContainer}"
                    meffed:NavigationExtensions.NavigateOnceLoaded="False"
                    Visibility="Visible" />

    <ContentControl x:Name="_viewContainer" Margin="0,0,0,10" />
<Window>

그러면 클래스 파일은

public partial class MainWindowView : Window
{
    public MainWindowView()
    {           
              InitializeComponent();
    }

        public ContentControl ViewContainer { get { return _viewContainer; } }

    }

각각의 을 '보다 낫다'로 할 수 .UserControl의 링크를 .meffed:NavigationExtensions.NavigateTo="secondView" ★★★★★★★★★★★★를 타겟으로 합니다.ContentControlWindow그냥 사용하다RelativeSource(:

meffed:NavigationExtensions.NavigationHost="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=ViewContainer}"

뒤에 에 '클래스 정의'에 .[NavigationView("firstview")]기타 등등.

처음 보는 일이지만 이해만 하면 아주 쉬울 거예요.

<ContentControl x:Name="K.I.S.S" Content="{Binding ViewModel, Converter={StaticResource ViewLocator}}"/>

언급URL : https://stackoverflow.com/questions/19654295/wpf-mvvm-navigate-views

반응형