【问题标题】:WPF listbox binding selected only updates items in view选定的 WPF 列表框绑定仅更新视图中的项目
【发布时间】: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 设置任何类型的属性来更新集合内的所有项目,不管它们是否可见?

【问题讨论】:

    标签: c# wpf xaml mvvm listbox


    【解决方案1】:

    我怀疑这是由于虚拟化造成的。 UI 项在滚动到视图中之前不存在。

    尝试关闭列表控件上的虚拟化:

    <ListBox ItemsSource="{Binding Path=SQLObjects}"
             VirtualizingPanel.IsVirtualizing="False">
    

    【讨论】:

    • 不,不是这样。我还尝试设置不同的虚拟化属性(缓存或容器虚拟化),但问题仍然存在。 MSDN 声明,当IsVirtualizing="False" 时应禁用虚拟化。有没有办法检查列表框是否被虚拟化?
    • 我做错了,我更改了错误的通用用户控件来测试虚拟化行为。您的解决方案有效,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2015-03-18
    • 2017-07-15
    相关资源
    最近更新 更多