4

我目前有Entity一个集合属性。我想知道为什么只有一次会触发并且一旦我尝试选择之前选择的项目SelectionChanged就不会再次触发。SelectionChanged

主窗口视图模型

  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 MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
        }
        private void Test(object sender, SelectionChangedEventArgs e)
        {
        }

我的列表框结构

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

public class Test1
{
    public string Content { get; set; }
}

我选择第一个对象,事件触发,我选择第二个对象,事件触发,我选择第一个对象,事件不触发,我选择第三个对象,事件触发。似乎它只触发和调用一次事件。

我的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>

测试方法只是一个空方法我只想每次更改时都打断点。

  private void Test(object sender, SelectionChangedEventArgs e)
    {
    }

更新 1:我试图在一个简单的 WPF 应用程序中重现这一点,似乎 ListBoxItem 正在将 IsEnabled 设置为 false,但我窥探了它并启用了所有控件。它只是得到一个看起来像禁用的灰色背景。将尝试进一步调查。

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

4

3 回答 3

6

要回答你的问题...

我想知道为什么 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"/>

.

        var list = new List<string>();
        list.Add("Element1");
        list.Add("Element2");
        list.Add("Element3");
        list.Add("Element4");

        listBox1.ItemsSource = list;
        listBox2.ItemsSource = list;

如果你现在Element1listBox1你的listBox_SelectionChangedget triggert 中选择Element2listBox2那么你的listBox_SelectionChangedget triggert 再次被选中。

如果你仔细看看你的,listBox1你会发现你的Background背后Element1是灰色的,这意味着它被选中,但没有焦点。如果您现在再次选择 Element1listBox1listBox_SelectionChanged不会触发,因为选择不会改变,只有 Focuse 会改变。

这与您的代码中的“问题”完全相同,因为您DataTemplate的想法与我们所做的相同,因为我们只是自动添加了 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];
    }
于 2013-06-20T07:36:16.067 回答
0

我发现的简单解决方案是selectedItemnull事件处理程序中进行。

private void tempList_SelectionChanged(object sender, SelectionChangedEventArgs e)

{    
    Card selectedOffer = (TempList.SelectedItem as Card);
    if (selectedOffer != null)
    {
        MessageBox.Show(selectedOffer._id);
    }
    ListBoxNeeded.SelectedItem = null;
}
于 2015-02-13T16:41:53.187 回答
-4

选择同一个项目不是一个 SelectionChanged 事件。选择没有改变。

问题陈述不清楚。

把它分解。这对我有用。如果我第二次选择任何项目,第 3 次,第 4 次事件触发。

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>
于 2012-05-28T16:28:14.347 回答