WPF 使用附加属性声明 ICommand
一、ListBox中为什么选择同一项不能每次都触发SelectionChanged事件呢?
当我需要每次点击ListBox的选中项,都触发事件。找到最符合的事件为SelectionChanged事件。但使用SelectionChanged事件时,并不能每次都触发。
这是因为SelectionChanged事件是选中项发生变化时才会触发,如果上次选中与本次相同,则单击是不会触发SelectionChanged事件。
二、使用附加属性声明 ICommand
我们可以使用附加属性声明一个ICommand解决以上问题。具体步骤如下:
(1)声明一个附加属性。
class AttachedLib
{
public static ICommand GetClick(DependencyObject obj)
{
return (ICommand)obj.GetValue(ClickProperty);
}
public static void SetClick(DependencyObject obj, ICommand value)
{
obj.SetValue(ClickProperty, value);
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ClickProperty =
DependencyProperty.RegisterAttached("Click", typeof(ICommand), typeof(AttachedLib), new PropertyMetadata(null));
}
(2)将该附加属性添加到ListBox上,并绑定待实现的ICommand。
<Grid>
<ListBox Margin="10"
ItemsSource="{Binding StudentCollection}"
ItemTemplate="{StaticResource StudentTemplate}"
local:AttachedLib.Click="{Binding SelectCommand}"></ListBox>
</Grid>
public ICommand SelectCommand { get; set; }
private void ExecuteSelectCommand(object obj)
{
if (obj is Student student)
{
MessageBox.Show($"{student.Id},{student.Name},{student.Age}","选中的学生信息");
}
}
public MainWindowVM()
{
StudentCollection = new ObservableCollection<Student>()
{
new Student(){Id = 1,Name = "Dwayne", Age = 10,},
new Student(){Id = 2,Name = "John", Age = 11,},
new Student(){Id = 3,Name = "Aaron", Age = 12,},
};
SelectCommand=new RelayCommand(ExecuteSelectCommand);
}
(3)在ListBox的ListBoxItem模板中,添加一个Button,Button的Command使用相对路径绑定该附加属性。
<DataTemplate x:Key="StudentTemplate" DataType="{x:Type local:Student}">
<Button BorderThickness="0"
Background="Transparent"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}, Path=(local:AttachedLib.Click)}"
CommandParameter="{Binding}">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="10,5" Width="100" Text="{Binding Id}"></TextBlock>
<TextBlock Margin="10,5" Width="200" Text="{Binding Name}"></TextBlock>
<TextBlock Margin="10,5" Width="100" Text="{Binding Age}"></TextBlock>
</StackPanel>
</Button>
</DataTemplate>
三、总结
通过以上操作,由Button触发单击事件,就可以实现”每次点击ListBox的选中项,都触发事件“的预期目标。
WPF 使用附加属性声明 ICommand的更多相关文章
- WPF通过附加属性控制窗口关闭
场景1 当使用 ShowDialog() 方式显示窗口时,通过定义附加属性的方式可实现在 ViewModel 中进行数据绑定(bool?)来控制子窗口的显示和关闭 public class ExWin ...
- WPF Adorner+附加属性 实现控件友好提示
标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效 ...
- WPF利用附加属性修改ShowGridLines效果
1.思路主要代码 wpf的gridline原本效果是虚线类型的.有时候需要设计成表格形式的,因此有了用附加属性来自动绘制边框线的想法. 思路:绘制Line并添加到grid的children里,但效果并 ...
- WPF使用附加属性绑定,解决data grid列绑定不上的问题
背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...
- 【WPF】附加属性
一直都对附加属性理解很模糊,今天看了一篇文章,恍然大悟,用个Demo掩饰一下对附加属性的理解 附加属性,简单的理解就是给一个对象外在的定义一个属性,使得该对象拥有和使用该属性,最典型的是Grid.Ro ...
- WPF 使用附加属性增加控件属性
使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...
- (WPF)附加属性
<Window x:Class="DeepXAML.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...
- WPF 依赖附加属性
附加属性的本质是一个依赖属性,与普通的依赖属性区别: 1:注册方法名不一样,如 DependencyProperty.RegisterAttached 2:没有普通的属性包装器,而是通过get和set ...
- 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】
UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...
随机推荐
- java学习(更新中)
class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...
- HarmonyOS三方件开发指南(16)-VideoCache 视频缓存
目录: 1.引言 2.功能介绍 3.VideoCache使用指南 4.VideoCache开发指南 5.<HarmonyOS三方件开发指南>系列文章合集 引言 对于视频播放器这个app大家 ...
- Distributed | Raft
1. 复制状态机 一致性算法是在复制状态机的背景下产生的.在这种方法下,一组服务器的状态机计算相同状态的相同副本,即使某些服务器宕机,也可以继续运行. 复制状态机通常使用复制日志实现,每个服务器存储一 ...
- 你真的了解Innodb存储引擎?
前言 前几篇记录了如何查看SQL执行计划.数据库事务相关的知识点 除了这两个,数据库还有两个是非常重要的,必须要考的 就是存储引擎和索引 今天先记录以下InnoDB存储引擎相关的知识点 MySQL存储 ...
- 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式
函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...
- JPA之排序条件查询
List<Monitoring> monitoringList = repository.findAll((root, query, cb) -> { List<Predica ...
- 02- APP需求分析与APP测试流程
在展开一轮测试的时候,我们要遵循一个规范的流程. APP测试流程: 项目立项:简单介绍项目内容是什么? 需求评审:开发,测试,和产品. 分析需求:编写测试用例 测试用例评审:一般测试团队参加,测试点是 ...
- FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb
apiAutoTestWeb使用说明 apiAutoTestWeb是为apiAutoTest的可视化版本,其采用前后端分离(FastAPI + Vue2)方式实现 具体使用: Python3 + Fa ...
- 转载:java.math.BigDecimal 比较大小
BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111); //使用compareTo方法比较 //注意:a.b ...
- Think5之ajax批量删除数据功能
//批量删除学员信息 public function deleteMany() { $id = input('post.'); //判断id是数组还是一个数值 if(is_array($id)){ f ...