博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF EventSetter Handler Command
阅读量:5915 次
发布时间:2019-06-19

本文共 11137 字,大约阅读时间需要 37 分钟。

 

最近做一个工具,突然发现ListBox和ListView等列表控件的MouseDoubleClick事件有时候是获取不到当前双击的行对象数据的,比如这样写:

View Code
private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)        {            ListBox listBox = sender as ListBox;            if (listBox == null || listBox.SelectedItem == null)            {                MessageBox.Show("ListBox1双击对象为空...");            }            else            {                var model = listBox.SelectedItem as ListBoxModel;                MessageBox.Show("当前对象为" + model.Name + "  " + model.Age);            }        }
View Code

双击行就会出现双击的对象为空。

上一篇文章中已经说明怎么解决这个问题:

使用Style中的EventSetter Handler这里就不在更多介绍。

但是今天想要解决的问题是怎么把EventSetter Handler使用Command绑定的方式把Handler事件进行解耦

要使用第三方类库CommandBehavior(AttachedCommandBehavior acb)进行解耦

代码如下:

引用    xmlns:localCommand="clr-namespace:AttachedCommandBehavior"

<Style x:Key="listBox2Item" TargetType="ListBoxItem">

<Style.Setters>
<Setter Property="localCommand:CommandBehavior.Event" Value="MouseDoubleClick"></Setter>
<Setter Property="localCommand:CommandBehavior.Command" Value="{Binding DataContext.DoubleCommand,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type local:WinTest}}}"></Setter>
<Setter Property="localCommand:CommandBehavior.CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}}"></Setter>
</Style.Setters>
</Style>

ViewModel代码如下

public class ViewModel : INotifyPropertyChanged    {        public ViewModel()        {            for (int i = 0; i < 5; i++)            {                DataList.Add(new ListBoxModel() { Name = "张三" + i.ToString(), Age = 1000 + i });                DataList2.Add(new ListBoxModel() { Name = "李四" + i.ToString(), Age = 100 + i });            }            doubleCommand = new SimpleCommand(obj =>            {                ListBoxItem listBoxItem = obj as ListBoxItem;                if (listBoxItem != null)                {                    ListBoxModel model = listBoxItem.Content as ListBoxModel;                    if (model != null)                    {                        CurrentSelectItem2 = model;                        MessageBox.Show("Command Banding" + model.Name + "  " + model.Age);                    }                }                //wpftest.ViewModel                MessageBox.Show("Cmd...");            }, o => true);        }        public SimpleCommand DoubleCommand        {            get            {                return doubleCommand;            }            set            {                doubleCommand = value;                //OnPropertyChanged(new PropertyChangedEventArgs("DoubleCommand"));            }        }        private ObservableCollection
dataList = new ObservableCollection
(); private ObservableCollection
_dataList2 = new ObservableCollection
(); private ListBoxModel _CurrentSelectItem; private ListBoxModel _CurrentSelectItem2; private SimpleCommand doubleCommand; public ObservableCollection
DataList { get { return dataList; } set { dataList = value; } } ///
/// 当前双击的对象 /// public ListBoxModel CurrentSelectItem { get { return _CurrentSelectItem; } set { _CurrentSelectItem = value; OnPropertyChanged(new PropertyChangedEventArgs("CurrentSelectItem")); } } ///
/// ListBox2双击的对象 /// public ListBoxModel CurrentSelectItem2 { get { return _CurrentSelectItem2; } set { _CurrentSelectItem2 = value; OnPropertyChanged(new PropertyChangedEventArgs("CurrentSelectItem2")); } } public ObservableCollection
DataList2 { get { return _dataList2; } set { _dataList2 = value; } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, e); } } }
View Code

完整Xaml和CS代码如下:

View Code
using AttachedCommandBehavior;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Shapes;namespace WpfTest{    ///     /// WinTest.xaml 的交互逻辑    ///     public partial class WinTest : Window    {        ViewModel VModel = new ViewModel();        public WinTest()        {            InitializeComponent();            this.DataContext = VModel;        }        private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)        {            ListBox listBox = sender as ListBox;            if (listBox == null || listBox.SelectedItem == null)            {                MessageBox.Show("ListBox1双击对象为空...");            }            else            {                var model = listBox.SelectedItem as ListBoxModel;                MessageBox.Show("当前对象为" + model.Name + "  " + model.Age);            }        }        private void ListBox2_MouseDoubleClick(object sender, MouseButtonEventArgs e)        {            ListBoxItem listBoxItem = sender as ListBoxItem;            if (listBoxItem == null)            {                MessageBox.Show("ListBox2双击对象为空...");            }            else            {                ListBoxModel model = listBoxItem.Content as ListBoxModel;                if (model != null)                {                    VModel.CurrentSelectItem2 = listBoxItem.Content as ListBoxModel;                    MessageBox.Show(model.Name + "  " + model.Age);                }            }        }    }    public class ViewModel : INotifyPropertyChanged    {        public ViewModel()        {            for (int i = 0; i < 5; i++)            {                DataList.Add(new ListBoxModel() { Name = "张三" + i.ToString(), Age = 1000 + i });                DataList2.Add(new ListBoxModel() { Name = "李四" + i.ToString(), Age = 100 + i });            }            doubleCommand = new SimpleCommand(obj =>            {                ListBoxItem listBoxItem = obj as ListBoxItem;                if (listBoxItem != null)                {                    ListBoxModel model = listBoxItem.Content as ListBoxModel;                    if (model != null)                    {                        CurrentSelectItem2 = model;                        MessageBox.Show("Command Banding" + model.Name + "  " + model.Age);                    }                }                //wpftest.ViewModel                MessageBox.Show("Cmd...");            }, o => true);        }        public SimpleCommand DoubleCommand        {            get            {                return doubleCommand;            }            set            {                doubleCommand = value;                //OnPropertyChanged(new PropertyChangedEventArgs("DoubleCommand"));            }        }        private ObservableCollection
dataList = new ObservableCollection
(); private ObservableCollection
_dataList2 = new ObservableCollection
(); private ListBoxModel _CurrentSelectItem; private ListBoxModel _CurrentSelectItem2; private SimpleCommand doubleCommand; public ObservableCollection
DataList { get { return dataList; } set { dataList = value; } } ///
/// 当前双击的对象 /// public ListBoxModel CurrentSelectItem { get { return _CurrentSelectItem; } set { _CurrentSelectItem = value; OnPropertyChanged(new PropertyChangedEventArgs("CurrentSelectItem")); } } ///
/// ListBox2双击的对象 /// public ListBoxModel CurrentSelectItem2 { get { return _CurrentSelectItem2; } set { _CurrentSelectItem2 = value; OnPropertyChanged(new PropertyChangedEventArgs("CurrentSelectItem2")); } } public ObservableCollection
DataList2 { get { return _dataList2; } set { _dataList2 = value; } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, e); } } } public class ListBoxModel : INotifyPropertyChanged { ///
/// 姓名 /// private string _Name; ///
/// 年龄 /// private int _Age; public string Name { get { return _Name; } set { _Name = value; OnPropertyChanged(new PropertyChangedEventArgs("Name")); } } public int Age { get { return _Age; } set { _Age = value; OnPropertyChanged(new PropertyChangedEventArgs("Age")); } } public void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) { PropertyChanged(this, e); } } public event PropertyChangedEventHandler PropertyChanged; }}
View Code

 

    <Setter Property="localCommand:CommandBehavior.Command" Value="{Binding DataContext.DoubleCommand,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type local:WinTest}}}"></Setter>

关于这个Command的Value绑定要使用FindAncestor进行查找才能解决,不然是绑定不到ViewModel中的DoubleCommand

发个图看看:

关于CommandBehavior代码可以在

下载使用

国外博客

对于SimpleCommad.cs的源文件我增加了两个参数的构造函数:

public SimpleCommand(Action execute, Predicate canExecute)        {            if (execute == null)                throw new ArgumentNullException("execute");            CanExecuteDelegate = canExecute;            ExecuteDelegate = execute;        }

转载于:https://www.cnblogs.com/ligl/p/5636899.html

你可能感兴趣的文章
周鸿祎:Nobody的微创新
查看>>
Docker 多宿主互联
查看>>
我的个人见解:如何认识一个人
查看>>
Kotlin 's Null safety
查看>>
比较web服务器、Servlet容器和web容器之间的异同
查看>>
linux字符系统安装桌面
查看>>
国内VDI市场之乱象分析,第二篇:传输协议篇
查看>>
HTTP Content-Type 类型整理
查看>>
Criteria查询及注解
查看>>
【MySQL】存储过程(很有用)
查看>>
2015年9月01日课程作业(练习)
查看>>
springMVC静态资源处理
查看>>
Java类初始化顺序
查看>>
宝塔面板一键docker部署
查看>>
struct
查看>>
C#.net 制作用户登录并连接数据库跳转页面
查看>>
redhat6.3部署gitlab
查看>>
Exchange Server2010系列之六:监控用户邮件
查看>>
为Kubernetes创建自定义Pod水平扩展器
查看>>
kubernetes API Server 权限管理实践
查看>>