【问题标题】:How to set viewmodel property from code-behind using Viewmodel-first?如何使用 Viewmodel-first 从代码隐藏设置 viewmodel 属性?
【发布时间】:2012-12-25 22:15:57
【问题描述】:

在我的 WPF (4.0) 应用程序中,我使用Viewmodel-first 模式。因此,首先创建我的视图模型,然后是视图 - 使用数据模板。可以在here 找到一个工作演示。

现在,从创建的视图(代码隐藏)中,我需要修改视图模型的属性。在View-first 方法中,我只需访问一个命名的视图模型实例。但是,Viewmodel-first 方法不允许这样做。有一个视图模型,但视图并不关心它是什么。

不好:

当然,您可以获取 DataContext 并使用它,但这有效地将视图和 t 视图模型。

private void MyView_Loaded(object sender, RoutedEventArgs e)
{
    this.viewModel = DataContext as MyViewModel;
}

为此必须有一个推荐的模式。命令?消息?请帮忙!

问:如何修改(设置属性)活动视图模型?

【问题讨论】:

  • “我需要修改视图模型的属性” => 这个假设很可能是错误的,并且有一种架构上更可取的方式来实现所需的效果。究竟是什么效果?

标签: c# wpf xaml mvvm viewmodel


【解决方案1】:

使用绑定将数据从 View 传递到 ViewModel,并使用命令来激活 ViewModel。

命令应该使用绑定来在 ViewModel 上执行命令。

消息应该用于 ViewModel 之间的通信。

.

【讨论】:

  • 这很棘手。我有一些高级鼠标事件处理程序,它们依赖于视图模型中的数据。如果无法访问,如何成功实现鼠标/拖动逻辑?
  • 让事件处理程序(在后面的代码中)引发您绑定到视图模型上的命令的事件。通过视图上的属性公开数据并绑定视图模型属性来访问视图模型中的数据。
  • 好的,有道理。所以在XAML 我做这样的事情? `
  • 是的。请记住,在 MVVM 中,View 显示 ViewModel。它应该是被动的,ViewModel 应该执行操作/命令。您应该在视图中拥有的唯一代码是处理用于显示目的的 UI 事件。
  • 在我的例子中,有一个没有滚动功能的 VirtualizingWrapPanel。不知何故,由用户单击(在按钮“NextPage”上)触发,我必须在 VirtualizingWrapPanel 上调用 PageDown 以允许它呈现下一部分数据。 VM 无法计算一次可以呈现多少项。所以我决定公开一个 View 必须订阅的事件。
【解决方案2】:

你不能那样做。否则 View 将知道 View Model。

如果这种初始化在所有视图模型中都是通用的,那么您可以在 ViewModelBase 中定义属性/事件并从此类派生所有视图模型。

问:如何修改(设置属性)活动视图模型?

您需要使用EventAggregator 模式进行 View-ViewModel 通信。

您可以使用自己喜欢的MVVM framework,并且几乎所有框架都支持EventAggregator(或MessageBusEnterprise Bus)。

【讨论】:

  • 是否可以使用这个EventAggregator 模式(从视图中)从视图模型中查询数据?我有几个场景,我必须从代​​码隐藏中进行视图模型查询:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多