source

DataContext 속성을 사용하여 XAML의 창에 ViewModel을 설정하려면 어떻게 해야 합니까?

manycodes 2023. 5. 26. 21:12
반응형

DataContext 속성을 사용하여 XAML의 창에 ViewModel을 설정하려면 어떻게 해야 합니까?

그 질문이 거의 모든 것을 말해줍니다.

창이 있고 전체 네임스페이스를 사용하여 DataContext를 ViewModel로 설정하려고 했는데 뭔가 잘못된 것 같습니다.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="BuildAssistantUI.ViewModels.MainViewModel">

대신 이것을 사용해 보세요.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>

다른 사용자가 제공한 솔루션 외에도 XAML에서 View Model을 지정하면서 특정 View Model을 View에서 분리하는 방법이 있습니다.분리된 테스트 사례를 작성하려는 경우 이러한 테스트 사례를 구분하는 것이 유용합니다.

App.xaml에서:

<Application
    x:Class="BuildAssistantUI.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"
    StartupUri="MainWindow.xaml"
    >
    <Application.Resources>
        <local:MainViewModel x:Key="MainViewModel" />
    </Application.Resources>
</Application>

기본 창.xaml에서:

<Window x:Class="BuildAssistantUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{StaticResource MainViewModel}"
    />

기본 뷰 모델을 인스턴스화하고 데이터 컨텍스트로 설정해야 합니다.문장에서 문자열 값으로 간주합니다.

     <Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BuildAssistantUI.ViewModels">
      <Window.DataContext>
        <local:MainViewModel/>
      </Window.DataContext>

뷰 모델을 지정하는 훨씬 더 나은 방법도 있습니다.

    using Wpf = System.Windows;

    public partial class App : Wpf.Application //your skeleton app already has this.
    {
        protected override void OnStartup( Wpf.StartupEventArgs e ) //add this.
        {
            base.OnStartup( e );
            MainWindow = new MainView();
            MainWindow.DataContext = new MainViewModel( e.Args );
            MainWindow.Show();
        }
    }

위의 메커니즘은 기본 뷰 모델에만 적용됩니다.사용자 컨트롤에 대해 묻는 아래의 설명을 다루기 위해 메커니즘은 하위 뷰 모델에 대해 다음과 같이 변환됩니다.

    public class ParentViewModel
    {
        public MyChildViewModel ChildViewModel { get; }
    
        public ParentViewModel()
        {
            ChildViewModel = new MyChildViewModel( ... );
        }
    }

ParentView.xaml:

    [...]
        xmlns:local="clr-namespace:the-namespace-of-my-wpf-stuff"
    [...]
        <local:MyChildView DataContext="{Binding ChildViewModel}" />
    [...]

<Rant>이전에 제안된 모든 솔루션에는 뷰 모델에 매개 변수 없는 생성자가 있어야 합니다.Microsoft는 매개 변수 없는 생성자를 사용하여 시스템을 구축할 수 있다는 인상을 받고 있습니다.만약 당신도 그런 인상을 받고 있다면, 부디 다른 해결책들을 사용하세요.생성자가 매개 변수를 가지고 있어야 하므로 객체의 인스턴스화를 마법 프레임워크의 손에 맡길 수 없다는 것을 이해하는 사람들에게 뷰 모델을 지정하는 적절한 방법은 위에서 보여드린 것입니다.</Rant>

당신은 Catel을 시도해 보는 것이 좋을 것입니다.창 대신 데이터 창 클래스를 정의할 수 있으며, 해당 클래스는 자동으로 뷰 모델을 만듭니다.이렇게 하면 원래 게시물에서 했던 것처럼 View Model 선언을 사용할 수 있으며, View Model은 계속 생성되어 DataContext로 설정됩니다.

예를 들어 이 기사를 참조하십시오.

그것을 xaml에 설정하는 것은 나에게 효과가 없었습니다.코드를 반복해서 검토했더니 모든 것이 정상으로 보였습니다.문제를 해결한 것은 WindowIsLoaded 이벤트 핸들러에서 DataContext를 설정한 것입니다.

PrintDrsAnywayViewModel TheWindowsViewModel = new PrintDrsAnywayViewModel();

private void MyWindowIsLoaded(object sender, RoutedEventArgs e)
{
    DataContext = TheWindowsViewModel;
    TheWindowsViewModel.WindowHeaderMessage = "snot";
}

작동 전과 작동 후에 동일한 xaml은 다음과 같습니다.

<TextBlock Text="{Binding WindowHeaderMessage, Mode=OneWay}"
          Margin="20,20,0,20" FontSize="20" />

WindowHeaderMessage는 INNotify를 구현하는 뷰 모델 파일의 문자열 속성입니다.속성 변경됨

hth

언급URL : https://stackoverflow.com/questions/4590446/how-do-i-set-a-viewmodel-on-a-window-in-xaml-using-datacontext-property

반응형