什么是之间的差异的RoutedCommand和RelayCommand?何时使用RoutedCommand以及何时在MVVM模式中使用RelayCommand?
我理解在MVVM中:
那么ViewModel如何响应用户对View所做的操作,例如在TextBox中键入内容或移动滑块等.
我知道这是通过RoutedEvents完成的,但我发现几乎所有的RoutedEvent示例都在View中使用CodeBehind,这正是你在MVVM中不再拥有的.
因此留下RoutedCommands我在MVVM中找到了更多的例子,但是例如移动滑块确实不是这个意义上的命令,它是一个事件,所以我想知道这是否真的应该使用.
然后,我读的意见,如" 在MVVM 使用RoutedEvents尽可能少,并没有RoutedCommands可言. " OK.
因此,例如在WPF模型 - 视图 - 视图模型工具包0.1项目中,自己就会形成一个" DelegateCommand ",它看起来也像一个有趣的方式.
然后有些人也在使用" RelayCommand ".
对于开发应用程序这样核心的事情,这是很多选择和困惑.
在MVVM中简单地完成我们过去10年使用Code Behind所做的工作的最佳方法是什么:
下面的代码是我以前的MVVM方法的重构(Fat Models,瘦的ViewModels和dumb Views,最好的MVVM方法?),我将逻辑和INotifyPropertyChanged实现从模型中移回ViewModel.这更有意义,因为正如所指出的,您经常必须使用您无法更改或不想更改的模型,因此您的MVVM方法应该能够使用任何模型类,因为它碰巧存在.
此示例仍允许您在Visual Studio和Expression Blend中以设计模式查看模型中的实时数据,我认为这很重要,因为您可以拥有设计器连接的模拟数据存储,例如最小和最大的字符串. UI可能会遇到,以便他可以根据这些极端情况调整设计.
问题:
如果您只是将XAML和代码复制到新的WPF项目中,则以下代码将起作用.
XAML:
<Window x:Class="TestMvvm73892.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestMvvm73892"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider
x:Key="DataSourceCustomer"
ObjectType="{x:Type local:CustomerViewModel}"
MethodName="GetCustomerViewModel"/>
</Window.Resources>
<DockPanel DataContext="{StaticResource DataSourceCustomer}">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=FirstName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Path=LastName}"/>
</StackPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=TimeOfMostRecentActivity}"/>
</StackPanel>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
using System;
using System.Windows;
using System.ComponentModel;
using System.Threading;
namespace TestMvvm73892
{
public partial class Window1 …Run Code Online (Sandbox Code Playgroud) 已经通过了一系列爱德华Tanguay的问题折射MVF应用程序的MVVM的使用,可以在他的Fat Models的链接侧边栏,瘦瘦的ViewModels和哑视图中找到,这是最好的MVVM方法吗?,他对Big smart ViewModels中的最终WPF应用程序,哑视图和任何模型,最好的MVVM方法感到有些困惑 ?
它的M(模型)是客户类:
//model
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime TimeOfMostRecentActivity { get; set; }
public static Customer GetCurrentCustomer()
{
return new Customer
{ FirstName = "Jim"
, LastName = "Smith"
, TimeOfMostRecentActivity = DateTime.Now
};
}
}
Run Code Online (Sandbox Code Playgroud)
返回当前用户.好吧,因为它返回了新创建的"当前"用户的重复...
但是在需要的情况下,M的数据存储和更新在哪里?
假设,我想将模型的当前用户更改FirstName为"Gennady"?
我添加了一个按钮,用于使用此按钮单击事件处理程序更新模型:
private void button1_Click(object sender, RoutedEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud)