WPF 列表框绑定选择只更新视图中的项目
WPF listbox binding selected only updates items in view
我 运行 遇到了一个奇怪的问题,即使用 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 绑定到主 window 中 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>
[...]
所有其他 TabItem 使用相同的用户控件并有相同的问题。
我不想使用解决方法(例如,当用户选择当前视图之外的项目时滚动整个列表),是否有任何类型的 属性 我可以为 WPF 设置更新所有集合中的项目,无论它们是否可见?
我怀疑这是由于虚拟化造成的。 UI 项目在滚动到视图之前不存在。
尝试关闭列表控件上的虚拟化:
<ListBox ItemsSource="{Binding Path=SQLObjects}"
VirtualizingPanel.IsVirtualizing="False">
我 运行 遇到了一个奇怪的问题,即使用 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 绑定到主 window 中 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>
[...]
所有其他 TabItem 使用相同的用户控件并有相同的问题。
我不想使用解决方法(例如,当用户选择当前视图之外的项目时滚动整个列表),是否有任何类型的 属性 我可以为 WPF 设置更新所有集合中的项目,无论它们是否可见?
我怀疑这是由于虚拟化造成的。 UI 项目在滚动到视图之前不存在。
尝试关闭列表控件上的虚拟化:
<ListBox ItemsSource="{Binding Path=SQLObjects}"
VirtualizingPanel.IsVirtualizing="False">