【发布时间】: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