我对如何在我的特定情况下将事件实现为命令感到有些困惑。我想尊重 MVVM,但在这种情况下不知道怎么做。
我有一个 WPF '视图' - viewCustomerSearch。这上面有一些文本框,当用户单击“搜索”时,结果会填充到 ListView 中。viewCustomerSearch 绑定到 viewmodelCustomerSearch,效果很好。
viewCustomerSearch 托管在 viewCustomer 上。
我想知道 viewCustomerSearch 公开一个自定义命令 - CustomerSelectedCommand - 每当双击 viesCustomerSearch 中的 ListView 时“触发”,然后由 viewCustomer 后面的视图模型(即 viewmodelCustomer)处理。这似乎正确实现了理论上的 MVVM 模式。
我将主要问题分解为三个较小的问题,但希望您能看到它们都是同一个挑战的组成部分。
第一个问题:为了让 viewCustomerSearch 公开一个自定义命令,我似乎必须将此代码放入 viewCustomerSearch - 这似乎“破坏”了 MVVM(后面的视图代码中没有代码)。
public readonly DependencyProperty CustomerSelectedCommandProperty = DependencyProperty.Register("CustomerSelectedCommand", typeof(ICommand), typeof(viewCustomerSearch));
public ICommand CustomerSelectedCommand
{
get { return (ICommand)GetValue(CustomerSelectedCommandProperty); }
set { SetValue(CustomerSelectedCommandProperty, value); }
}
第二个问题(这是真正困扰我的问题):最好通过展示我会做什么来破坏 MVVM 来解释。我会在视图中有一个事件处理程序:
private void lstResults_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (CustomerSelectedCommand != null) CustomerSelectedCommand.Execute(((ViewModels.viewmodelCustomerSearchResult)this.lstResults.SelectedItem).CustomerId);
}
嗯......我知道你不应该把这个事件处理程序放在这里;相反,它应该有一个命令来在 viewmodelCustomerSearch 中处理它。这里的两个问题是
因为'CustomerSelectedCommand' ICommand 是在 viewCustomerSearch 中实现的,所以 viewmodelCustomerSearch 看不到它来触发它。
我看不到如何将 MouseDoubleClick 事件绑定到命令,而不是后面的视图代码中的事件处理程序。我正在阅读有关附加属性的信息,但看不到如何在此处应用它们。
(请注意:我在应用程序的其他地方使用通用的“RelayCommand”;这在这里起作用吗??)
第三个问题:当我在事件处理程序后面的代码中使用非 MVVM 方式触发命令时,您可以看到我将 Selected Customer Id 作为参数传递给命令。如何在 viewCustomer 的命令处理程序中看到该参数?我创建了一个新的 RelayCommand 来处理它,但似乎 Execute 方法不接受参数?
鉴于以上所有情况,我不得不说我个人并不赞同“MVVM 意味着视图中没有代码”。这对我来说似乎很疯狂;完全与视图有关的代码,并且仅与视图有关,恕我直言,不应进入视图模型。尽管如此,这看起来确实像逻辑上的东西(不是视图的东西)。
非常感谢您的一些见解。对不起,很长的帖子;试图平衡足够的信息来帮助我处理“战争与和平”。
DS