【问题标题】:Reference the View from ViewModel while using DataTemplate for the ViewModel在为 ViewModel 使用 DataTemplate 时从 ViewModel 引用 View
【发布时间】:2014-03-11 17:11:04
【问题描述】:

我正在使用 DataTemplate 来提供 View 与 ViewModel 的关联,例如:

<DataTemplate DataType="{x:Type viewModels:SomeViewModel}">
    <views:SomeView />
</DataTemplate>

现在我需要在我的 ViewModel 中以某种方式引用视图,因此我可以直接通过其名称引用某些控件。 有什么办法吗?

  • 注意 我已经尝试将 SomeView 参数添加到 SomeViewModel Ctor,但 SomeView Ctor 被调用了两次(一个用于我发送到 SomeViewModel Ctor 的实例,并且我猜是因为框架......)

感谢您的帮助

【问题讨论】:

  • 那么如果你想在 ViewModel 中引用视图,你就没有使用 MVVM,我不建议这样做。如果您不能直接使用 Binding,我将使用您的 SomeView 的代码隐藏文件来访问和更新基于 ViewModel-Properties 的控件或更新 ViewModel-Properties。
  • 请尝试在此处解释您的全部需求,以便我们使用 MVVM 方式为您提供更好的解决方案。如果您不想完全使用 MVVM,那么只需捕获视图 onload 事件并在后面的代码中设置“this.DataContext.SomeViewModelSomeProperty = this.WhateverControl”
  • 当我尝试在我的视图模型中引用视图时,我知道这不再是 MVVm,在特定情况下我需要将视图收紧到视图模型,有没有办法那个?
  • 你具体想做什么?
  • 有一个内容控件,根据当前视图模型显示视图。简化 - 认为我有 2 个按钮,当我按下第一个按钮时,它会创建 viewmodel1 并将其设置为 contentcontrol 内容 dp,当我按下第二个按钮时,它会创建 viewmodel2,依此类推。我的问题是我别无选择,只能在我的一个视图中关联一个控件,但是由于数据模板正在执行视图和视图模型之间的关联,我无法在视图模型的 ctor 中传递视图/它的一个控件。够清楚吗?

标签: wpf datatemplate


【解决方案1】:

也许这就是你要找的东西:

public partial class SomeView : UserControl
{
    public SomeView()
    {
        InitializeComponent();
        this.Loaded += View_Loaded;
    }

    void SomeView_Loaded(object sender, RoutedEventArgs e)
    {
        var someViewModel = (SomeViewModel)this.DataContext;
        someViewModel.View = this;
    }
}

【讨论】: