【发布时间】:2019-01-24 19:20:54
【问题描述】:
我有一个 WPF 应用程序,其中 ListBox 的内容会在用户按下按钮时更新。我最初的问题是将 ListBox 重新聚焦到特定的 SelectedIndex 值,该值绑定到我的 ViewModel 中的 ActiveItem 属性。我能够使用以下代码解决此问题:
XAML:
<ListBox ItemsSource="{Binding ListOfItems}" SelectedIndex="{Binding ActiveItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True" SelectionChanged="ListBox_SelectionChanged" x:Name="ListBoxSelector">
代码隐藏:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxSelector.ScrollIntoView(ListBoxSelector.SelectedItem);
}
但是,我目前在 MainWindow.xaml.cs 文件而不是我的 ViewModel 中有上述代码隐藏。我的问题是如何将此代码移动到 ViewModel 以便我可以坚持 MVVM 模式?我不太清楚如何从 ViewModel 正确处理 ListBox 的 ScrollIntoView 属性。
【问题讨论】:
-
我认为没有办法。通常,MVVM 的 VM 部分响应数据绑定,而不是 UI 控制。您想要做的事情特定于 WPF,因此,如果您将视图模型移动到另一个项目(例如 Xamarin) - 您想要访问的代码将不起作用。当然,您可以将列表框作为 ViewModel 构造函数的参数传递,并在绑定属性更改时滚动到视图中,但这不是最好的主意
-
如果您使用的是 MVVM light,您可以考虑使用消息来通知您要滚动查看的窗口。