MVVM设计模式:原理、实现与争议探讨
立即解锁
发布时间: 2025-08-26 00:48:29 阅读量: 18 订阅数: 46 AIGC 


Silverlight 4商业应用开发指南
# MVVM设计模式:原理、实现与争议探讨
## 1. MVVM模式基础与数据绑定
在MVVM设计模式中,当将控件属性绑定到ViewModel的属性时,绑定会监听ViewModel引发的`PropertyChanged`和`ErrorsChanged`事件(前提是实现了`INotifyPropertyChanged`和`INotifyDataErrorInfo`接口),这表明属性值或验证错误集合发生了变化,这是各层之间一种隐藏的交互方式。
有时会遇到这样的问题:需要将视图中的控件(如`ListBox`或`DataGrid`)绑定到ViewModel公开的集合属性,但在ViewModel实例化时该集合不可用。例如,要将视图中的`ListBox`控件绑定到ViewModel公开的对象集合,但ViewModel实例化时还未从服务器获取该集合。
解决办法是让ViewModel将集合公开为`ObservableCollection`类型的属性。ViewModel实例化时,先实例化一个空的`ObservableCollection`供`ListBox`控件绑定。从服务器获取集合后,将其内容添加到这个空集合中(而非替换它),视图会监听该集合的变化并相应更新。
此外,ViewModel通常还会公开一个名为`IsBusy`的布尔属性,指示ViewModel是否正在等待服务器响应。视图中的`BusyIndicator`控件可绑定该属性,在ViewModel与服务器通信时显示指示器,告知用户应用正在等待数据返回。为简化场景,暂不考虑该属性和绑定。
## 2. 视图调用ViewModel操作的方法
ViewModel中的操作(包含逻辑和行为)会以公共方法的形式公开。例如,登录界面场景中,ViewModel有`BeginLogin`方法,视图中有登录按钮,需在用户点击登录按钮时调用`BeginLogin`方法。
在Silverlight中,有三种方式可调用ViewModel上的操作:
- 在代码隐藏文件中调用
- 使用由控件事件触发的操作或行为
- 使用命令(Silverlight 4新增)
### 2.1 代码隐藏文件调用
这是传统解决方案,但不符合MVVM模式中视图与ViewModel的交互方式。
### 2.2 使用操作或行为
可借助Expression Blend Interactivity库中的`CallMethodAction`操作来调用ViewModel上的方法。例如,要在按钮点击时调用ViewModel的`Login`方法,可在按钮的XAML中添加以下代码:
```xml
<Button Name="LoginButton" Content="Log In" Height="30" Width="90">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}"
MethodName="Login"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
```
虽然看起来XAML代码较多,但使用Expression Blend配置操作和行为很方便,而Visual Studio没有此功能。
### 2.3 使用命令
命令是一种将操作及其参数封装在ViewModel之外的方式,可将操作逻辑移到单独的类中,实现逻辑与ViewModel状态的解耦,便于逻辑复用。命令作为ViewModel的属性公开,控件可绑定并在特定事件触发时调用。
#### 2.3.1 创建命令
创建命令类需实现`ICommand`接口。例如,将`Login`方法封装在`LoginCommand`类中:
```csharp
public class LoginCommand : ICommand
{
public bool CanExecute(object parameter)
{
return true; // 可添加逻辑
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
// 命令逻辑
}
}
```
然后在
0
0
复制全文
相关推荐









