WPF MVVM 탐색 뷰
여러 뷰가 있는 WPF 어플리케이션이 있습니다.보기 1에서 보기 2로 전환하고 여러 보기로 전환할 수 있습니다.그래서 같은 창에 view2를 로드하는 view1의 버튼을 원합니다.
나는 그것들을 시도해 보았지만, 효과가 없다.
- WPF용 MVVM Light를 사용하여 창을 탐색하는 방법
- https://galasoft.ch/posts/2011/01/navigation-in-a-wp7-application-with-mvvm-light
첫 번째 링크부터 View Model Locator 코드를 이해하지 못하는 것이 문제입니다.그들은 그것을CreateMain();
이 기능은 어디에 정의되어 있으며 뷰 내부에서 다른 뷰로 전환하려면 어떻게 해야 합니까?
첫째, MVVM을 구현하기 위해 이러한 툴킷/프레임워크가 필요하지 않습니다.이렇게 간단할 수 있어요예를 들어, 이 데이터에는MainViewModel
,그리고.PersonViewModel
및 aCompanyViewModel
, 각각 관련 뷰가 있고 각각 확장되어 있습니다.abstract
베이스 클래스BaseViewModel
.
인BaseViewModel
, 공통 속성을 추가할 수 있습니다.ICommand
인스턴스 및 구현INotifyPropertyChanged
인터페이스입니다.이 모든 것이 확장되고 있기 때문에BaseViewModel
클래스, 우리는 이 속성을MainViewModel
모든 뷰 모델로 설정할 수 있는 클래스:
public BaseViewModel ViewModel { get; set; }
물론 이 기능을 구현하고 있을 것입니다.INotifyPropertyChanged
이 빠른 예시와 달리 사용자의 속성에서 올바르게 인터페이스할 수 있습니다.자, 들어가겠습니다.App.xaml
심플함을 선언합니다.DataTemplate
s: 뷰를 뷰 모델과 연결합니다.
<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"
★★★★★★★★★★★★를 타겟으로 합니다.ContentControl
Window
그냥 사용하다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
'source' 카테고리의 다른 글
임의의 순서로 두 개의 이름을 포함하는 문자열과 일치하도록 정규 표현 (0) | 2023.04.12 |
---|---|
현재 날짜에서 7일 빼기 (0) | 2023.04.12 |
Objective-C의 자동 기준 계수가 방지하거나 최소화하지 못하는 누출의 종류는 무엇입니까? (0) | 2023.04.12 |
Python 목록의 True Bohan 수 계산 (0) | 2023.04.12 |
Excel VBA 함수 결과 새로 고침 (0) | 2023.04.12 |