我正在尝试为视图模型中ObservableCollection<>
中包含的几个按钮创建拖放功能,该集合随后用作{{ 1}}:
这是xaml结构:
ItemsSource
StackPanel
继承自<ItemsControl x:Name="RingHolder" Grid.Column="0" Grid.ColumnSpan="3" ItemsSource="{Binding Rings}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<customControls:RingsStackpanel Orientation="Vertical" VerticalAlignment="Bottom"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<customControls:RingControl VerticalAlignment="Stretch" Height="50"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
,而RingsStackPanel
继承自StackPanel
。
为了允许按钮自由拖动,我想像这样将其与父项分离:
RingControl
但是我得到以下异常:
InvalidOperationException:
不能显式修改用作ItemsControl的ItemsPanel的Panel的Children集合。 ItemsControl为Panel生成子元素
这很有意义,我只能通过修改绑定到它的Button
来进行修改,但是在这种情况下,从if (VisualTreeHelper.GetParent(this) is ContentPresenter contentPresenter)
{
if (VisualTreeHelper.GetParent(contentPresenter) is RingsStackpanel ringStackPanel)
{
ringStackPanel.Children.Remove(contentPresenter);
}
}
中删除一项会导致所选ItemsSource
在被摧毁时消失。无论如何,我可以允许我的ObservableCollection<>
自由地移动,而无需创建它的副本(因为当前该项目几乎是不可能的)。
答案 0 :(得分:1)
您可以从源集合中删除数据项,并将公共方法添加到RingsStackpanel
类中,以从逻辑树中删除视觉内容:
public class RingsStackpanel : StackPanel
{
...
public void RemoveElement(Visual visual) => RemoveVisualChild(visual);
}
然后,您应该能够处理Unloaded
的{{1}}事件,并使用ContentPresenter
删除其父子对象。像这样:
StackPanel