【问题标题】:Connecting Window with ViewModel用 ViewModel 连接窗口
【发布时间】:2013-02-07 05:14:06
【问题描述】:

我有以下代码

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="UI/ResourceDirectory.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
            <local:MainWindow></local:MainWindow>
        </DataTemplate>
    </ResourceDictionary>

</Window.Resources>

它给出了以下错误

不能在样式中放置窗口

我找到了this的答案。

我已经在主窗口中完成了所有必需的 UI 编码,但无法将其与相应的 ViewModel 连接(将其放置在另一个项目中,我正在使用它的引用)。

所以我的问题是,“为什么我不能这样做?”、“如何将 Window 控件与 ViewModel 连接?”、“我应该使用 UserControl 来代替吗?”

【问题讨论】:

  • 为什么不用UserControl 而不是Window
  • 因为我之前做过编码。它是 WPF 中的一个演示应用程序,供我学习。我提到,如果根本不可能,那么我会尝试 UserControl。

标签: c# wpf viewmodel


【解决方案1】:

您试图将一个窗口放在另一个窗口中,但这是不可能的。连接 View 和 ViewModel 要简单得多,但取决于您的项目结构。 可以在Window构造函数中设置,例如:

public partial class MainWindow : Window    
{
    public MainWindow ()
    {
        this.DataContext = new MainWindowViewModel();
        InitializeComponent();
    }
}

您尝试采用的方法不适用于 Windows,并且仅当您将 ViewModel 本身放入 XAML 时才有用。

【讨论】:

    【解决方案2】:

    要将视图模型连接到视图,您必须在 xaml 代码中执行以下操作。

    <Window.DataContext>
       <viewModel:MainWindowViewModel/>
    </Window.DataContext>
    

    viewModel 是命名空间。

    xmlns:viewModel="clr-namespace:TestProject.ViewModel"
    

    您不应该在视图的代码隐藏中设置视图模型!

    【讨论】:

    • 在这种情况下将VM初始化放在哪里真的很重要吗?如果它具有无参数构造函数,则将其放入构造函数或 XAML 仅取决于团队编码约定。还是我错过了什么?以及如何解决VM构造函数有参数的情况?
    • 对不起,我以为这是 mvvm :)
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多