【问题标题】:Move objects around multiple ObservableCollection在多个 ObservableCollection 周围移动对象
【发布时间】:2018-08-22 16:20:19
【问题描述】:

我有三个 Items Control,详细如下,目前我有三个随附的 Observable 集合,每个控件一个。我希望能够从一个组框中移动其中一个对象,并让它出现在另一个中。目前,我正在将其从原始可观察集合中删除,然后将其添加到新集合中。然而,这导致了线程问题,其中 UI 并不总是更新移动。有没有更好的方法在可观察集合之间移动对象。比如只有一个,但改变哪些在哪个控件中呈现?任何帮助表示赞赏。

XAML:

<GroupBox x:Name="OnTimeGroup">
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl x:Name="OnTimeCards">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <UserControl:OnTimeCard Visibility="Visible" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>
</GroupBox>
<GroupBox x:Name="LateGroup">
    <StackPanel>
        <ItemsControl x:Name="LateCards">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <UserControl:LateActionNeededCard Ignore="LateCardIgnoreClicked" Publish="LateCardPublishClicked" Visibility="Visible" />
                    </materialDesign:TransitioningContent>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>
</GroupBox>
<GroupBox x:Name="PublishedGroup">
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl x:Name="PublishedCards">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <UserControl:PublishedCard Update="PublishedCardUpdateClicked" Visibility="{Binding IsVisible}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </ScrollViewer>
    </GroupBox>

C#

private ObservableCollection<LiveTime> OnTimeCardsCollection = new ObservableCollection<LiveTime>();
private ObservableCollection<LiveTime> LateCardsCollection = new ObservableCollection<LiveTime>();
private ObservableCollection<LiveTime> PublishedCardsCollection = new ObservableCollection<LiveTime>();

当前代码的伪代码

当用户点击对象上的按钮时,将其从当前的 observable 集合中移除。然后在相邻的 observable 集合中创建一个全新的对象。

【问题讨论】:

  • 如果您遇到线程问题,那么也许您应该在 UI 线程上进行移动?我还看到了一些问题,如果您不清除要从中删除的集合的“当前选定”,它就会崩溃。
  • 我的旧解决方案的问题是,如果您只移动几个对象,它就可以工作,但是如果您在关闭的时间段内移动 5+,则程序不会更新 GUI 以反映这一点.它永远不会崩溃,只是不会反映变化。
  • 因此,暂停OnPropertyChanged 机制,直到完成所有更改,然后再释放它。那么只有 1 个“变化”而不是 5 个。
  • 我不知道那是一回事,谢谢。我将对此进行调查并提供更新。

标签: c# .net wpf observablecollection


【解决方案1】:

您在这里有两个不同的问题:

  1. 更改 observable 集合和 UI 对其做出反应:Observable Collections 就是为此而设计的,删除/添加应该没有问题。当然,例外情况是工作未在 UI 线程上完成或同步未正确完成。我建议启用集合同步,而不是编组对 UI 线程的每次调用。参考这篇关于collection synchronization的帖子

  2. 为所有三个项目控制一个集合,但显示不同的内容:是的。您可以通过应用适当的过滤器来使用CollectionView 执行此操作。这是一篇关于CollectionViewSource的文章

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多