zoukankan      html  css  js  c++  java
  • WPF命令使用

    What

    命令包含以下部分:

    命令:一个实现了ICommand接口的类,RoutedCommand是WPF里最常用的命令类,其它命令类大多派生自RoutedCommand

    命令源:触发命令的对象,如button,menu等

    命令目标:默认为命令源对象,显示指定CommandTarget=XXX之后,实际执行命令的对象为XXX,可通过执行函数的e.Source进行确认

    命令关联:把命令源和命令以及命令的逻辑函数关联起来

    why

    命令可以实现一处定义,处处使用的好处。不同的命令源只要绑定同一个命令就会执行该命令绑定的执行函数。

    解除前后端耦合,通过XAML绑定命令,后台代码类中可不再引用窗体控件

    how

    1、定义命令

            public static ICommand AddCommand = new RoutedCommand();
    

      

    2、定义命令执行函数

            public void Add(object sender, ExecutedRoutedEvente e)
            {
                MessageBox.Show(e.Parameter.ToString());
    
                //标记为已处理,不再向上传递
                e.Handled = true;
            }
            public void CanAdd(object sender, CanExecuteRoutedEvente e)
            {
                if (string.IsNullOrEmpty(e.Parameter.ToString()))
                    e.CanExecute = false;
                else
                    e.CanExecute = true;
    
                e.Handled = true;
            }
    

    3、关联绑定命令和执行函数,并添加到控件的关联绑定集合

           this.CommandBindings.Add(new CommandBinding(AddCommand, Add, CanAdd));
    

      

    4、绑定命令源

           <Button Content="clickme" 
                    Command="{x:Static local:TestWindow.AddCommand}" 
                    CommandParameter="{Binding Text ,ElementName=txtMsg}" />
    

      

    完整代码:

    XAML

    <Window x:Class="WpfTest.TestWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfTest"
            mc:Ignorable="d"
            Title="TestWindow" Height="300" Width="300">
    
        <StackPanel>
            <TextBox x:Name="txtMsg" Text="123" />
            <!--第四步:把命令绑定到命令源-->
                <Button Content="clickme" 
                    Command="{x:Static local:TestWindow.AddCommand}" 
                    CommandParameter="{Binding Text ,ElementName=txtMsg}" />
        </StackPanel>
    </Window>

    XAML.CS

    using System.Windows;
    using System.Windows.Input;
    
    namespace WpfTest
    {
        /// <summary>
        /// TestWindow.xaml 的交互逻辑
        /// </summary>
        public partial class TestWindow : Window
        {
            //第一步:定义命令
            public static ICommand AddCommand = new RoutedCommand();
    
    
            //第二步:定义执行函数
            public void Add(object sender, ExecutedRoutedEvente e)
            {
                MessageBox.Show(e.Parameter.ToString());
    
                //标记为已处理,不再向上传递
                e.Handled = true;
            }
            public void CanAdd(object sender, CanExecuteRoutedEvente e)
            {
                if (string.IsNullOrEmpty(e.Parameter.ToString()))
                    e.CanExecute = false;
                else
                    e.CanExecute = true;
    
                e.Handled = true;
            }
    
            public TestWindow()
            {
                InitializeComponent();
                //第三步:关联命令和执行函数,并添加到窗体的命令绑定集
                this.CommandBindings.Add(new CommandBinding(AddCommand, Add, CanAdd));
    
            }
        }
    }
  • 相关阅读:
    算法题
    AIO和NIO的理解
    Redis面试考点
    对MVVM的理解
    Vuex状态管理模式
    vue 的computed 和 watch 两者的区别
    vue之组件通信
    vue生命周期钩子函数
    angularjs 运行时报错ERROR in node_modules/rxjs/internal/types.d.ts(81,44): error TS1005: ';' expected. node_modules/rxjs/internal/types.d.ts(81,74): error TS1005: ';' expected. node_modules/rxjs/internal/t
    浅入不深出--vuex的简单使用
  • 原文地址:https://www.cnblogs.com/kavilee/p/8042580.html
Copyright © 2011-2022 走看看