【发布时间】:2021-04-16 07:18:39
【问题描述】:
我在使用 WPF 和 MVVM 的 UserControl 中遇到了一个奇怪的问题。列表框的项目通过 ViewModel 和 ObservableCollection<T> 绑定,样式属性 IsSelected 绑定到单个项目内的属性 Selected。
[...]
<ListBox ItemsSource="{Binding Path=SQLObjects}" FontFamily="Consolas" Margin="5,0,5,5" DisplayMemberPath="Name" SelectionMode="Extended" SelectedItem="{Binding Path=SelectedSQLObject}">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource MetroListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Selected, Mode=TwoWay}" />
</Style>
</ListBox.Resources>
</ListBox>
[...]
当用户选择单个或多个项目(使用 ctrl 或 shift)时,属性会按预期更新。但是选择所有带有ctrl + a 的项目只会更新列表框滚动区域内可见项目的Selected 属性。
在屏幕截图中,所有项目均使用ctrl + a 选择,但只有当前可见的项目的属性已更新。在列表框中向下滚动而不更改选择时,所有项目都会在它们出现时更新。
这可能是由MahApps.Metro引起的吗?
ViewModel 绑定到主窗口中 xaml 内的 UserControls Datacontext。
[...]
<TabItem Header="Trigger">
<userControls:ObjectControl>
<userControls:ObjectControl.DataContext>
<viewmodel:TriggerObjectViewModel DialogCoordinator="{x:Static local:MainWindow.Coordinator}" />
</userControls:ObjectControl.DataContext>
</userControls:ObjectControl>
</TabItem>
[...]
所有其他 TabItems 使用相同的用户控件并且有相同的问题。
我不想使用解决方法(例如,当用户在当前视图之外选择项目时滚动整个列表),是否可以为 WPF 设置任何类型的属性来更新集合内的所有项目,不管它们是否可见?
【问题讨论】: