我目前有一个ListBox,其ItemsSource集合绑定到我的viewmodel上的一个属性,类型为IEnumerable.当preoprty的引用发生更改时,ListBox会按预期更新,但是我有一个问题,如果我有大量项目并滚动到ListBox的底部,然后将引用更改为包含,例如,1项目的另一个集合,ListBox视图为空,不显示滚动条.然后我必须用鼠标滚轮向上滚动列表框,直到1项进入视图.
因此,我认为我所追求的是,只要ItemsSource属性发生更改,就会将ListBox的滚动位置重置为顶部,这样无论收集的大小有多少,都会始终显示某些内容.
我一直在尝试让我的WPF应用程序提示用户丢弃未保存的更改,或者在使用TreeView导航时取消.
我想我发现了一个错误.MessageBox与PreviewMouseDown不兼容.它似乎"处理"了一个点击,无论如何显示一个MessageBox,它的e.Handled是如何设置的.
对于这个XAML ......
<TreeView Name="TreeViewThings"
...
PreviewMouseDown="TreeViewThings_PreviewMouseDown"
TreeViewItem.Expanded="TreeViewThings_Expanded"
TreeViewItem.Selected="TreeViewThings_Selected" >
Run Code Online (Sandbox Code Playgroud)
...比较这些替代方法......
Sub TreeViewNodes_PreviewMouseDown(...)
e.Handled = False
End Sub
Sub TreeViewNodes_PreviewMouseDown(...)
MessageBox.Show("Test", "Test", MessageBoxButton.OK)
e.Handled = False
End Sub
这两种方法表现不同.没有MessageBox,TreeViewNodes_Selected()或者TreeViewThings_Expanded()会执行.使用MessageBox,他们不会.
这是一个错误还是在这里发生了一些我应该理解的事情?
我PreviewMouseDown在TreeView上发生了一个事件,以确定用户是否可以根据某些逻辑选择其他项目.如果当前项目数据发生更改,将显示MessageBox,询问用户是否要放弃更改.如果用户按YES,我设置e.Handled = false;为启用新选择.如果用户按NO,我设置e.Handled = true;取消新选择.
问题是虽然我设置了e.Handled = false,但事件停止并且TreeView上没有选择事件.有人有解决方案吗?
提前致谢!