【问题标题】:Listbox SelectionChanged firing in error when window layout changes窗口布局更改时,Listbox SelectionChanged 触发错误
【发布时间】:2014-03-05 10:32:36
【问题描述】:

我在一个带有其他组件的窗口上有一个 ListBox。 当我更改这些其他组件的可见性时,ListBox 会使用新的 selectedIndex = 0 触发其 SelectionChanged 事件。这是非常不可取的。 (如果您插入断点,或者可能是休眠,则不会发生这种情况。

我想要一个仅在用户实际更改 ListBox 选择时触发的可靠事件,而不是在 WPF 仅更改窗口布局时触发。 是否存在这样的东西,或者为了更强大的东西我应该使用按钮从头开始构建自己的控件?

【问题讨论】:

  • 你想要SelectionChanged 做什么?在做 WPF 的这些年里,我从未使用过它。甚至没有一次。你想做什么?顺便说一句,发布您当前的代码和 XAML。
  • 我想知道用户何时使用鼠标或键盘更改列表框选择。那么你应该怎么做呢?当前代码太大,无法发布。我现在没有一个小例子。
  • @thund - 这不是真的。 SelectionChanged 永远不会因其他控件的可见性更改而被触发。您必须在此处发布相关的小示例代码以复制问题。
  • 从不??? 这是一个令人印象深刻的声明;)显然我认为我有一个反例。它目前又大又复杂,所以如果感兴趣的话,我将不得不将其缩减为可发布的内容。同时,我从头开始构建了自己的控件,似乎没有这样的奇怪之处。

标签: wpf events layout listbox selectionchanged


【解决方案1】:

为了更强大的东西

如果您想要一个健壮的应用程序,您需要一个健壮的设计。

如果您正在使用 WPF,则需要摒弃传统的基于事件的方法,理解并接受 The WPF Mentality

我想知道用户何时使用鼠标或键盘更改 列表框选择

不要处理事件,而是放置一堆代码,并希望可视化树的复杂性允许它工作,只需使用正确的DataBinding

<ListBox ItemsSource="{Binding SomeCollection}"
         SelectedItem="{Binding SelectedItem}"/>

到正确的ViewModel:

public class MyViewModel
{
    public ObservableCollection<MyClass> SomeCollection {get;set;}

    public MyClass SelectedItem {get;set;} //Don't forget INotifyPropertyChanged
}
  • 看看我是如何不处理任何事件或放置任何代码的。可视化树可以做任何事情并引发尽可能多的事件,而我的代码仍然可以工作。
  • 还可以了解这种方法如何更加简洁,因为它可以真正分离 UI 和数据。
  • 我可以一直谈论适当的 MVVM 的优点,但我现在太懒了。如果您需要进一步的帮助,请告诉我。

【讨论】:

  • 谢谢。是的,我熟悉 WPF 的思维方式,并且有几千行数据绑定代码。但是,我也花费了无数个小时来追踪由此产生的晦涩错误,有时我想要一些更干净、更简单的东西,我可以完全自己控制,而不是希望我不会遇到任何 WPF“未记录的功能”。这是这样一个时代。我只想让 ListBox 告诉我用户何时更改了他的选择。对它来说,这似乎是一件相当合理的事情。
  • obscure bugs arising from it - 你的意思是 obscure bugs arising from not implementing it properly - 你声明你 want something simpler that you can control 证明你对 WPF 的工作原理和应该使用的方式缺乏正确的理解。
  • 不,我不是那个意思。我对自己的错误负全部责任,我找到它们,并修复它们。但是 WPF 本身也有很多问题。如果我想要在 Windows Phone、RT、Silverlight ;) 或 .NET3.5 上运行的东西,那么不一致和错误就会成倍增加。因此,与其在论坛上花费数小时试图确定与 MS 平台相关的错误并用#ifs 将它们一一消除,我通常宁愿自己从头开始构建一些干净的东西。但无论我出于什么奇怪的原因,MS 确实为我们提供了 ListBox 事件。所以我认为我要求一个有用的是完全正确的。
  • @thund 好的,如果您有此类问题的具体示例,请向我展示。我可以帮助你完成它并在我们进行的过程中学到一些东西。
  • 谢谢,下次出现时我会通知您。但现在我正在研究一种不同的方法..
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2011-11-03
  • 2021-06-23
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多