一、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的更多相关文章

  1. WPF通过附加属性控制窗口关闭

    场景1 当使用 ShowDialog() 方式显示窗口时,通过定义附加属性的方式可实现在 ViewModel 中进行数据绑定(bool?)来控制子窗口的显示和关闭 public class ExWin ...

  2. WPF Adorner+附加属性 实现控件友好提示

    标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效 ...

  3. WPF利用附加属性修改ShowGridLines效果

    1.思路主要代码 wpf的gridline原本效果是虚线类型的.有时候需要设计成表格形式的,因此有了用附加属性来自动绘制边框线的想法. 思路:绘制Line并添加到grid的children里,但效果并 ...

  4. WPF使用附加属性绑定,解决data grid列绑定不上的问题

    背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...

  5. 【WPF】附加属性

    一直都对附加属性理解很模糊,今天看了一篇文章,恍然大悟,用个Demo掩饰一下对附加属性的理解 附加属性,简单的理解就是给一个对象外在的定义一个属性,使得该对象拥有和使用该属性,最典型的是Grid.Ro ...

  6. WPF 使用附加属性增加控件属性

    使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...

  7. (WPF)附加属性

    <Window x:Class="DeepXAML.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...

  8. WPF 依赖附加属性

    附加属性的本质是一个依赖属性,与普通的依赖属性区别: 1:注册方法名不一样,如 DependencyProperty.RegisterAttached 2:没有普通的属性包装器,而是通过get和set ...

  9. 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

随机推荐

  1. Android Studio 之 编写精美的聊天界面

    •准备工作 首先制作一张 .9 格式的聊天气泡,参见我的这篇博客: 需要注意的是,制作完成后,应该将原始文件删除,否则AS会分不清楚而报错. 新建一个 Empty Activity,Java 和 XM ...

  2. starctf_2019_babyshell

    starctf_2019_babyshell 有时shellcode受限,最好的方法一般就是勉强的凑出sys read系统调用来注入shellcode主体. 我们拿starctf_2019_babys ...

  3. Day16_98_IO_一边读一边写

    一边读一边写 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutp ...

  4. C#入门到精通系列课程——第3章变量及运算符

    ◆本章内容 (1)变量是什么 (2)变量的声明及初始化 (3)常量 (4)运算符 (5)数据类型转换 (6)运算符优先级及结合性 (7)难点解答 ◆本章简述 很多人认为学习C#之前必须要学习C++,其 ...

  5. WinForm只运行运行一个实例(单开)

    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.F ...

  6. OO Unit2 总结

    OO Unit2 总结 OO课Unit2电梯仿真项目技术回顾 BUAA.1823.邓新宇 2020/4/17 Part1 设计策略 从多线程的协同和同步控制方面,分析和总结自己三次作业的设计策略 第一 ...

  7. html书签展示(带搜索)

    源代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...

  8. js弹窗的3种方式:alert、confirm、prompt

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. LA3602DNA序列

    题意:      给你一个一些DNA序列(只有ACGT)然后让你构造一个序列,使得所有的序列到他的Hamming距离最小,所有的序列包括构造的序列长度都是N,Hamming表示两个序列的不同字符位置个 ...

  10. hdu4909 状态压缩(偶数字符子串)

    题意:       给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表 示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ...