C# WPF列表框选择已更改

C# WPF列表框选择已更改,c#,wpf,listbox,C#,Wpf,Listbox,我当前有一个实体,该实体上有一个集合属性。我想知道为什么SelectionChanged只触发一次,并且在我尝试选择之前选择的项目时不会再次触发SelectionChanged MainWindowViewModel public MainWindowViewModel() { var a = new List<Test>(); a.Add(new Test() { Name = "Leo", Test1 = new List<Te

我当前有一个
实体
,该实体上有一个集合属性。我想知道为什么
SelectionChanged
只触发一次,并且在我尝试选择之前选择的项目时不会再次触发
SelectionChanged

MainWindowViewModel

  public MainWindowViewModel()
    {
        var a = new List<Test>();

        a.Add(new Test() { Name = "Leo", Test1 = new List<Test1> { new Test1() { Content = "aaa"} } });
        a.Add(new Test() { Name = "2", Test1 = new List<Test1> { new Test1() { Content = "bbb"} } });
        a.Add(new Test() { Name = "Le33o", Test1 = new List<Test1> { new Test1() { Content = "ccc"} } });
        A = a;
    }

    private List<Test> _a;
    public List<Test> A
    {
        get { return _a; }
        set { _a = value; OnPropertyChanged("A");}
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
我的列表框结构

public class Test
{
    public List<Test1> Test1 { get; set; }
    public string Name
    {
        get;set;
    }
}

public class Test1
{
    public string Content { get; set; }
}
测试方法只是一个空方法,我只想在每次更改时命中断点

  private void Test(object sender, SelectionChangedEventArgs e)
    {
    }
更新1:我试图在一个简单的WPF应用程序中重现这一点,似乎ListBoxItem的IsEnabled变为false,但我嗅到了它,并且所有控件都已启用。它只是得到了一个灰色的背景,看起来像残疾人。我们将尝试进一步调查


更新2:更改项目时,ListBoxItem IsSelected属性似乎没有取消设置。

选择相同的项目不是SelectionChanged事件。选择没有改变

问题陈述不清楚

把它拆开。这对我有用。如果我第二次、第三次、第四次选择任何项目,事件将触发

OP断言,如果它是列表中的列表,则它不起作用。对我来说仍然有效

    public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        public List<ListList> ListList1 
        {
            get { return new List<ListList>{new ListList("name1", new List<string> { "one", "two", "three" })}; } 
        }

        private void Test(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = (ListBox)sender;
            System.Diagnostics.Debug.WriteLine(lb.SelectedItem.ToString());
        }

        public class ListList
        {
            public string Name { get;  set; }
            public List<string> Values { get;  set; }
            public ListList(string name, List<string> values) { Name = name; Values = values; }
        }

<ListBox ItemsSource="{Binding Path=ListList1}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <ListBox  SelectionChanged="Test" ItemsSource="{Binding Path=Values}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
public主窗口()
{
this.DataContext=this;
初始化组件();
}
公共列表1
{
获取{返回新列表{新列表(“名称1”,新列表{“一”、“二”、“三”})};}
}
私有无效测试(对象发送方,SelectionChangedEventArgs e)
{
列表框lb=(列表框)发送器;
System.Diagnostics.Debug.WriteLine(lb.SelectedItem.ToString());
}
公共类列表
{
公共字符串名称{get;set;}
公共列表值{get;set;}
公共列表列表(字符串名称,列表值){name=name;values=values;}
}

要回答您的问题

我想知道为什么SelectionChanged只会触发一次,而一旦我尝试选择该选项,它不会再次触发SelectionChanged 以前选择的项目

。。。以边做边学的方式

打开一个新的WPF项目添加2个列表框为两者创建一个SelectionChanged事件,并向每个列表框添加一些项目

让我们提一下现在看起来是这样的

    <ListBox Height="100" Name="listBox1" Width="120" SelectionChanged="listBox_SelectionChanged"/>
    <ListBox Height="100" Name="listBox2" Width="120" SelectionChanged="listBox_SelectionChanged"/>

我发现的简单解决方案是在事件处理程序中将
selectedItem
设置为
null

private void tempList_SelectionChanged(object sender, SelectionChangedEventArgs e)

{    
    Card selectedOffer = (TempList.SelectedItem as Card);
    if (selectedOffer != null)
    {
        MessageBox.Show(selectedOffer._id);
    }
    ListBoxNeeded.SelectedItem = null;
}

我不理解c#代码与XAML的关系。你可能想说得更精确一些。给你实体的结构,这就是为什么我在那里有C代码,xaml是我绑定它的方式。它触发得很好,我试着用不同的普通实体复制它,它的行为是一样的。我很难相信这种方法不会在您描述的环境下运行。您可能无法获得预期的结果,但这可能是因为该方法的逻辑存在缺陷。您是否尝试在“Test”中放置断点?是的,我不需要为Test放置方法,因为它只是一个空方法,我只想让它触发。我确实设置了断点。@DisplayNameismissing我知道这是一篇很老的文章,但不适合我回答您的问题?当您选择另一个项目并重新选择该项目时,情况并非如此。问题陈述是“选择以前选择的项目”。记下你的问题陈述因为不清楚,而不是记下这个答案。现在表现得像个孩子,因为有人把你的答案记下来了,所以你会把这个问题记下来。如果有不清楚的地方,你应该在评论中询问,并不是stackoverflow的每个人都有好的英语。那你要怎么说清楚呢?“选择之前选择的项目”这不是意味着您之前已经选择了该项目,然后重新选择了它吗?我正在标记答案,因为它不清楚。一个项目源无效-它没有属性到期日期。包括似乎不属于问题的文本块。三个“重新选择”仍然不清楚。清除将是:第一次选择一个项目,事件将激发。第一次选择另一项,事件将激发。即使我选择了另一个项目并返回,第二次选择一个项目也会触发事件。第一,如果某些属性的属性不存在,这并不重要。你知道怎么用WPF编码吗?第二,有一个编辑选项,可以让问题变得清晰。如果你重新措辞了这句话,你认为它对每个人都是清楚的,那么就去编辑它,我会批准它。
    <ListBox Height="100" Name="listBox1" Width="120" SelectionChanged="listBox_SelectionChanged"/>
    <ListBox Height="100" Name="listBox2" Width="120" SelectionChanged="listBox_SelectionChanged"/>
        var list = new List<string>();
        list.Add("Element1");
        list.Add("Element2");
        list.Add("Element3");
        list.Add("Element4");

        listBox1.ItemsSource = list;
        listBox2.ItemsSource = list;
    private object seletedItem;
    private ListBox ItemsHost;

    private void Test(object sender, SelectionChangedEventArgs e)
    {
        var buff = sender as ListBox;

        if (seletedItem != null)
            if (ItemsHost != buff)
                ItemsHost.SelectedItem = null;

        ItemsHost = buff;

        if (e.AddedItems.Count > 0)
            seletedItem = e.AddedItems[0];
    }
private void tempList_SelectionChanged(object sender, SelectionChangedEventArgs e)

{    
    Card selectedOffer = (TempList.SelectedItem as Card);
    if (selectedOffer != null)
    {
        MessageBox.Show(selectedOffer._id);
    }
    ListBoxNeeded.SelectedItem = null;
}