既然讲到MVVM模式,自然第一个问题就是MVVM的含义。MVVM是Model-View-ViewModel的缩写形式,它通常被用于WPF或Silverlight开发。
模型(Model)
Model——可以理解为带有字段,属性的类。
视图(View)
View——可以理解为我们所看到的UI。
视图模型(View Model)
View Model在View和Model之间,起到连接的作用,并且使得View和Model层分离。View Model不仅仅是Model的包装,它还包含了程序逻辑,以及Model扩展,例如,如果Model中有一个公开属性不需要在UI上显示,此时我们可以不再View Model中去定义它。
MVVM的例子
<Window.DataContext>
<vm:ViewModel1></vm:ViewModel1>
</Window.DataContext>
<Grid Background="{Binding BgColor,Mode=TwoWay}" >
<Button x:Name="c" Height="20" Width="30" Command="{Binding ChangeBg}" >
</Button>
</Grid>
public readonly static DependencyProperty BgColorProperty = DependencyProperty.Register("BgColor",typeof(Brush),typeof(ViewModel1));
public Brush BgColor
{
get
{
return (Brush)GetValue(BgColorProperty);
}
set
{
SetValue(BgColorProperty, value);
}
//get;set;
}
public ICommand ChangeBg {
get {
return new DelegateCommand(
(param) => {
this.BgColor = Brushes.Blue;
//MessageBox.Show(param.ToString());
}
,(v)=> { return true; } );
}
}
class DelegateCommand : ICommand
{
private Action<object> executeAction;
private Func<object, bool> canExecuteFunc;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{ }
public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
{
if (execute == null)
{
return;
}
executeAction = execute;
canExecuteFunc = canExecute;
}
public bool CanExecute(object parameter)
{
if (canExecuteFunc == null)
{
return true;
}
return canExecuteFunc(parameter);
}
public void Execute(object parameter)
{
if (executeAction == null)
{
return;
}
executeAction(parameter);
}
}
Viewmodel1 即为window的逻辑处理类 将其设置为window的datacontext
需要注意的是BgColor 必须为依赖属性DependencyProperty 这样在BgColor 的value改变时才能及时影响到view
命令绑定 commandbinding
wpf 内置了很多预定义的命令 可以在view中为预定义的命令设置处理函数 (只在当前元素及其子元素中有效?)
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="cmd_Open_Executed">
</CommandBinding>
</Window.CommandBindings>
然后再讲元素的command绑定到预定义命令
<Button x:Name="c" Height="20" Width="30" Command="ApplicationCommands.Open" >
那么问题来了 对于 Grid 这些没有command属性的元素怎么绑定命令呢
我们可以用InputBindings为输入设备对于此元素不同的输入绑定处理
<Grid.InputBindings>
<MouseBinding Gesture="LeftClick" Command="{Binding ChangeBg}"></MouseBinding>
<KeyBinding Gesture="Alt+S" Command="{Binding ChangeBg}"></KeyBinding>
</Grid.InputBindings>
先这样吧