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

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

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

<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">



답변

다른 사람들이 제공 한 솔루션 (좋고 올바른) 외에도 XAML에서 ViewModel을 지정하면서도 특정 ViewModel을 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>

MainWindow.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:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>


답변

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>


답변

Catel 을 사용해 볼 수도 있습니다 . (Window 대신) DataWindow 클래스를 정의 할 수 있으며 해당 클래스는 자동으로 뷰 모델을 생성합니다. 이렇게하면 원래 게시물에서했던 것처럼 ViewModel의 선언을 사용할 수 있으며 뷰 모델은 여전히 ​​생성되고 DataContext로 설정됩니다.

예제는 이 기사 를 참조하십시오 .


답변

viewmodel을 지정하는 다음과 같은 방법도 있습니다.

using Wpf = System.Windows;

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

<랜트>

이전에 제안 된 모든 솔루션에는 MainViewModel매개 변수없는 생성자 가 있어야합니다.

Microsoft는 매개 변수없는 생성자를 사용하여 시스템을 구축 할 수 있다는 인상을 받았습니다. 당신도 그 인상을 받고 있다면 다른 해결책을 사용하십시오.

생성자에 매개 변수가 있어야하므로 객체의 인스턴스화는 매직 프레임 워크의 손에 맡길 수 없다는 것을 알고있는 사람들에게 뷰 모델을 지정하는 올바른 방법은 위에서 보여준 방법입니다.

</ Rant>


답변