【问题标题】:Initialising a user control in code behind not working - MVVM WPF在代码中初始化用户控件不起作用 - MVVM WPF
【发布时间】:2015-03-18 18:16:34
【问题描述】:

我在后面的代码中初始化用户控件,因为控件 ctor 将 MainViewModel 作为参数。我也有一个默认的 ctor 来让 XAML 满意。

现在,据我了解 - XAML 使用默认 ctor 自动初始化用户控件,但是当我在后面的代码中重新初始化它时 - 我可以看到这不起作用,因为我遇到了各种绑定错误。

XAML:

  <childViews:SomeView x:Name="SomeViewUc"/>

XAML.cs:

public MainView(IMainViewModel mainViewModel)
{
    InitializeComponent();

    DataContext = mainViewModel;
    SomeViewUc = new SomeView(new SomeViewModel(mainViewModel)); 
}

为什么新的初始化不起作用?有什么想法吗?

【问题讨论】:

  • 您确定以这种方式设置视图上下文是个好主意吗?大多数人都是通过 xaml 做到这一点的。同样,您的视图也依赖于视图模型。

标签: c# wpf xaml mvvm


【解决方案1】:

您不能以这种方式替换现有控件...您需要从父控件中删除该控件并添加一个新控件。

但是你有没有尝试过这样的事情?

public MainView(IMainViewModel mainViewModel)
{
    InitializeComponent();

    DataContext = mainViewModel;
    SomeViewUc.DataContext = new SomeViewModel(mainViewModel); 
}

您应该考虑其他方法来实例化视图模型,例如使用view model locator 或直接在 XAML 中。我写了一篇关于视图模型实例化和其他最佳实践的blog article

【讨论】:

  • SO,可以通过将UC的数据上下文绑定到主视图模型中的属性来设置它们吗?这些视图是子视图,位于主视图内。在这种情况下,主视图模型将引用所有子视图模型。这是一个好习惯吗?
  • 我会说这不是一个好习惯。我认为每个视图都应该实例化其视图模型本身,并且应该使用依赖属性对子视图进行参数化......(看看我的文章)
  • 非常感谢!我最终在接受 MainViewModel 的子视图上创建了一个 Dependency 属性,并且视图设置了它自己的数据上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2016-08-08
相关资源
最近更新 更多