我目前有Entity一个集合属性.我想知道为什么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;
Run Code Online (Sandbox Code Playgroud)
我的主窗口
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
private void Test(object sender, SelectionChangedEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
我的列表框结构
public class Test
{
public List<Test1> Test1 { get; set; }
public string Name
{
get;set;
}
}
public class Test1
{
public string Content { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我选择第一个对象,事件触发,我选择第二个对象,事件触发,我选择第一个对象,事件不触发,我选择第三个对象,事件触发.它似乎只触发并调用一次事件.
我的XAML代码:
<ItemsControl x:Name="Lists" ItemsSource="{Binding A}" Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" FontWeight="Bold"
Style="{StaticResource DefaultTextBlockStyle}" />
<ListBox SelectionChanged="Test" ItemsSource="{Binding Test1}"
Margin="5,0,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Content}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
测试方法只是一个空方法我只想在每次更改时都达到断点.
private void Test(object sender, SelectionChangedEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)
更新1:我试图在一个简单的WPF应用程序中重现这一点,似乎ListBoxItem使IsEnabled变为false但我已经窥探它并且所有控件都已启用.它只是得到一个看起来像残疾人的灰色背景.将尝试进一步调查.
更新2:更改项目时似乎未取消设置ListBoxItem IsSelected属性.
回答你的问题......
Element1
......通过实践来学习
打开一个新的WPF项目添加2个列表框为两个创建一个SelectionChanged事件,并向每个列表框添加一些项目
让我们提一下它现在就像这样
<ListBox Height="100" Name="listBox1" Width="120" SelectionChanged="listBox_SelectionChanged"/>
<ListBox Height="100" Name="listBox2" Width="120" SelectionChanged="listBox_SelectionChanged"/>
Run Code Online (Sandbox Code Playgroud)
.
var list = new List<string>();
list.Add("Element1");
list.Add("Element2");
list.Add("Element3");
list.Add("Element4");
listBox1.ItemsSource = list;
listBox2.ItemsSource = list;
Run Code Online (Sandbox Code Playgroud)
如果现在选择listBox1在listBox_SelectionChanged你Element2之后选择GET triggert listBox2你listBox_SelectionChanged让你listBox1获取的triggert一次.
如果你仔细看看你Background的Element1背后,你会看到你背后Element1是灰色的,这意味着它被选中,但没有聚焦.如果你现在选择 listBox1你的listBox_SelectionChanged再次DataTemplate没有获得triggert因为选择不会改变只有Focuse.
这就是你的代码中完全相同的"问题",因为我们Element1做了同样的想法,因为我们只是自动添加了2个列表框
作为简单和污垢的解决方法,您可以使用以下代码
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];
}
Run Code Online (Sandbox Code Playgroud)