У меня есть ItemControl, который имеет Canvas как ItemPanelTemplate и эллипс как ItemTemplate. То, что я хочу сделать, это когда я перетаскиваю существующий Ellipse, я хочу, чтобы он был удален из моей наблюдаемой коллекции объектов EllipseXY, то есть он также будет удален из моего Canvas. Событие перетаскивания проходит по объекту EllipseXY, который затем можно сравнить в событии Drop. Однако, когда я удаляю объект EllipseXY в моей коллекции, он остается на моем холсте, несмотря на то, что Remove был запущен. Каковы могут быть возможные причины?Проблема удаления объектов из наблюдаемой коллекции
Модель:
public class EllipseXY
{
public double X { get; set; }
public double Y { get; set; }
public Ellipse EllipseObject { get; set; }
}
ViewModel:
private ObservableCollection<EllipseXY> ellipses;
public ObservableCollection<EllipseXY> Ellipses
{
get { return ellipses; }
set
{
if (ellipses == null)
{
ellipses = new ObservableCollection<EllipseXY>();
ellipses = value;
}
else
{
ellipses = value;
}
RaisePropertyChanged("Ellipses");
}
}
#region EllipseXY
public EllipseXY EllipseXY
{
get { return ellipsexy; }
set
{
ellipsexy = value;
RaisePropertyChanged("EllipseXY");
}
}
public Ellipse EllipseObject
{
get { return ellipsexy.EllipseObject; }
set
{
ellipsexy.EllipseObject = value;
RaisePropertyChanged("EllipseObject");
}
}
public double X
{
get { return ellipsexy.X; }
set
{
ellipsexy.X = value;
RaisePropertyChanged("X");
}
}
public double Y
{
get { return ellipsexy.Y; }
set
{
ellipsexy.Y = value;
RaisePropertyChanged("Y");
}
}
#endregion
Drag:
DataObject dragObject= new DataObject("dragObject", elliXY);
DragDrop.DoDragDrop(dragEllipse, dragObject, DragDropEffects.Move);
падения (не весь код, но только отношение один к этому вопросу):
Model.EllipseXY ellipseXY = (Model.EllipseXY)e.Data.GetData("dragObject");
Ellipses.Remove(ellipseXY);
Я также попытался с помощью LINQ:
EllipseXY test = (EllipseXY)Ellipses.Where(ellipse => ellipse.EllipseObject.Fill == dropEllipse.Fill);
Ellipses.Remove(test);
Но без успеха: P
Edit XAML:
<ItemsControl ItemsSource="{Binding Ellipses}" DockPanel.Dock="Top">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Name="CanvasDrop" Margin="10,0,10,0" Width="500" Height="400"
ClipToBounds="True" Background="{Binding Image}" AllowDrop="True" IsItemsHost="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseMove">
<gala:EventToCommand Command="{Binding DragCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="Drop">
<gala:EventToCommand Command="{Binding DropCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
<Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="Ellipse">
<Ellipse Fill="{Binding EllipseObject.Fill}" Style="{StaticResource ellipseStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Можете ли вы показать, как ваш 'ItemsControl' связывается с списком« Ellipses »? –
Попробуйте открытый класс EllipseXY: INotifyPropertyChanged – Vishal
@Farzi: Как это должно помочь? Вопрос заключается не в изменении каких-либо атрибутов экземпляра «EllipseXY», а в изменении списка. –