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;
}