从面板上删除子项,并绑定到ItemsSource

时间:2018-11-20 13:36:28

标签: c# wpf xaml

我正在尝试为视图模型中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<>自由地移动,而无需创建它的副本(因为当前该项目几乎是不可能的)。

1 个答案:

答案 0 :(得分:1)

您可以从源集合中删除数据项,并将公共方法添加到RingsStackpanel类中,以从逻辑树中删除视觉内容:

public class RingsStackpanel : StackPanel
{
    ...
    public void RemoveElement(Visual visual) => RemoveVisualChild(visual);
}

然后,您应该能够处理Unloaded的{​​{1}}事件,并使用ContentPresenter删除其父子对象。像这样:

StackPanel