programing

WPF MVVM 컨텐츠 제어 + 데이터를 사용하는 이유직선 XAML 창 보기가 아닌 템플릿 보기?

goodcopy 2023. 5. 28. 22:07
반응형

WPF MVVM 컨텐츠 제어 + 데이터를 사용하는 이유직선 XAML 창 보기가 아닌 템플릿 보기?

왜 그럴까요?

주 창.xaml:

<Window x:Class="MVVMProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Window>

ExampleView.xaml을 다음과 같이 설정합니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    <DataTemplate DataType="{x:Type vms:ExampleVM}" >
        <Grid>
            <ActualContent/>
        </Grid>
    </DataTemplate>
</ResourceDictionary>

다음과 같은 창을 만듭니다.

public partial class App : Application {

    protected override void OnStartup(StartupEventArgs e) {

        base.OnStartup(e);

        MainWindow app = new MainWindow();
        ExampleVM context = new ExampleVM();
        app.DataContext = context;
        app.Show();
    }
}

언제 이렇게 할 수 있을까요?

App.xaml: (시작 창/보기 설정)

<Application x:Class="MVVMProject.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="ExampleView.xaml">
</Application>

예제View.xaml: (리소스 사전이 아닌 창)

<Window x:Class="MVVMProject.ExampleView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vms="clr-namespace:MVVMProject.ViewModels">
    >
    <Window.DataContext>
        <vms:ExampleVM />
    </Window.DataContext>

    <Grid>
        <ActualContent/>
    </Grid>
</Window>

기본적으로 "데이터 템플릿으로 보기"(VaD)와 "창으로 보기"(VaW)입니다.

비교에 대한 저의 이해는 다음과 같습니다.

  • VaD: 창을 닫지 않고 보기를 전환할 수 있습니다.(이것은 내 프로젝트에 바람직하지 않습니다)
  • VaD: VM는 View에 대해 전혀 알지 못하지만 VaWit에서는 다른 창을 열 때 이를 인스턴스화할 수 있어야 합니다.
  • VaW: 디자이너에서 렌더링된 샘플을 실제로 볼 수 있습니다(최소한 현재 설정에서는 VaD를 사용할 수 없습니다).
  • VaW: 창을 열고 닫는 작업을 직관적으로 수행합니다. 각 창에는 해당 보기(및 보기 모델)가 있습니다.
  • VaD: ViewModel은 초기 창 너비, 높이, 크기 조정 등을 속성을 통해 전달할 수 있습니다(VaW에서는 창에 직접 설정됨).
  • VaW: FocusManager를 설정할 수 있습니다.초점 요소(VaD에서의 방식은 확실하지 않음)
  • VaW: 내 창 유형(예: 리본, 대화 상자)이 보기에 통합되므로 파일 수가 줄어듭니다.

그래서 무슨일이야?XAML에서 윈도우를 구축하고 VM 속성을 통해 해당 데이터에 액세스한 후 이를 완료할 수는 없습니까?코드백은 동일합니다(사실상 0).

보기 항목을 모두 리소스 사전에 섞어야 하는 이유를 이해하기 위해 고심하고 있습니다.

사용자DataTemplatesView Model에 따라 View를 동적으로 전환하려는 경우에는 다음과 같이 설정할 수 있습니다.

<Window>
    <Window.Resources>
       <DataTemplate DataType="{x:Type local:VM1}">
          <!-- View 1 Here -->
       </DataTemplate>

       <DataTemplate DataType="{x:Type local:VM2}">
          <!-- View 2 here -->
       </DataTemplate>
    </Window.Resources>

    <ContentPresenter Content="{Binding}"/>

</Window>

그렇게,

한다면Window.DataContext의 예입니다.VM1,그리고나서View1표시됩니다.

그리고 만약에

Window.DataContext의 예입니다.VM2,그리고나서View2표시됩니다.

물론 1개의 보기만 필요하고 변경되지 않는 경우에는 전혀 의미가 없습니다.

VaD에서는 뷰 모델이 뷰에 대해 아무것도 모르기 때문에 뷰 모델만으로 완전히 구성된 완벽하게 작동하는 애플리케이션을 구축할 수 있습니다.이는 전적으로 코드로 구동될 수 있는 응용 프로그램을 작성할 수 있는 가능성으로 이어집니다.따라서 GUI 없이 통합 테스트를 수행할 수 있습니다.GUI를 통한 통합 테스트는 취약하기로 악명 높은 반면 뷰 모델을 통한 테스트는 더 강력해야 합니다.

경험으로 볼 때: 사항에 이 모두 가능합니다.두 작업 모델 모두 원하는 작업과 응용프로그램 요구사항에 따라 사용할 수 있습니다.뒤에 있는 아이디어VaD내용 및 컨테이너를 해독하는 중입니다.을 구현하는 VaD이 유형의 항목을 표시할 때마다 이 템플릿을 사용할 수 있습니다(기본값).에서 사용할 수 있습니다.ItemsControls, grids 및 (lists, list views, grids) 및ContentControls바인딩만 만듭니다.대로 네가말시피다했피▁like시.VaD새 창을 닫거나 열지 않고 창의 내용을 전환할 수 있습니다.또한 다음을 사용하여 보기를 정의할 수 있습니다.UserControls그런 다음 초점 요소를 제어하고 코드를 관리할 수 있습니다.따라서 데이터 템플릿은 다음과 같습니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
<DataTemplate DataType="{x:Type vms:ExampleVM}" >
    <CustomUserControl A="{Binding A}" B="{Binding B}" DataContext="{Binding}" .../>
</DataTemplate>

은 또한 에 있습니다.UserControl앱을 바인딩 및 디커플링할 수 있기 때문에 종속성 속성을 설정할 수 있습니다.

하지만 물론 앱이 동적으로 컨텐츠를 전환할 필요가 없다면 사용해도 괜찮습니다.VaW주 창 또는 다른 창에 사용할 수 있습니다.실제로 두 가지를 모두 사용할 수 있습니다.VaW그리고.VaD이 마지막 것은 윈도우가 필요 없는 앱의 내부 항목에 사용할 수 있습니다.애플리케이션 요구 사항과 앱 개발에 사용할 수 있는 시간에 따라 무엇이 더 나은지 선택합니다.이 개인적인 경험이 도움이 되길 바랍니다...

언급URL : https://stackoverflow.com/questions/19864891/wpf-mvvm-why-use-contentcontrol-datatemplate-views-rather-than-straight-xaml-w

반응형