WPF列表框SelectionChanged

123*_*9 0 2 c# wpf listbox

我目前有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属性.

Wii*_*axx 5

回答你的问题......

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)

如果现在选择listBox1listBox_SelectionChangedElement2之后选择GET triggert listBox2listBox_SelectionChanged让你listBox1获取的triggert一次.

如果你仔细看看你BackgroundElement1背后,你会看到你背后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)