WPF的MVVM开发模式 与 databinding 和commandbinding

既然讲到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>
先这样吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值