Обновление пользовательского интерфейса при добавлении в наблюдаемую коллекцию - PullRequest
0 голосов
/ 10 марта 2012

iv'e получил 2 элемента управления элементов, связанных с 2 наблюдаемыми коллекциями

my ItemsControls:

    <ItemsControl Grid.Column="4"  Name="Pipe19"  ItemsSource="{Binding Path=Pipes[19].Checkers}" Style="{StaticResource ItemsControlStyle}" ItemsPanel="{StaticResource TopPipePanelTemplate}" />
    <ItemsControl Grid.Column="5"  Name="Pipe18"  ItemsSource="{Binding Path=Pipes[18].Checkers}" Style="{StaticResource ItemsControlStyle}" ItemsPanel="{StaticResource TopPipePanelTemplate}" />

их определения через стиль:

   <Style TargetType="{x:Type ItemsControl}" x:Key="ItemsControlStyle">
        <Setter Property="ItemTemplate" Value="{StaticResource PipeDataItem}"></Setter>
        <Setter Property="AllowDrop" Value="True"></Setter>
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ItemsControl_MouseLeftButtonDown"></EventSetter>
         <EventSetter Event="Drop" Handler="ItemsControl_Drop"></EventSetter>
   </Style> 

оба считаются объектами выпадения, они содержат элементы эллипса, которые мне нужно перетащить из одного в другое.проблема заключается в том, что операция добавления части не отображается в пользовательском интерфейсе.

Visual Helper:

enter image description here

при перетаскиванииперетащите в виде эллипса справа налево:

- это код, который захватывает эллипс и сохраняет управление исходным кодом

    private void ItemsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ItemsControl control = (ItemsControl)sender;
        UIElement element = control.InputHitTest(e.GetPosition(control)) as UIElement;

        if (element != null)
        {
            Ellipse ellipse = element as Ellipse;
            DragSource = control;
            DragDrop.DoDragDrop(ellipse, ellipse, DragDropEffects.Copy);
        }
    }

этокод, где эллипс перетаскивается на его цель:

    private void ItemsControl_Drop(object sender, DragEventArgs e)
    {
        ItemsControl target = (ItemsControl)sender;
        Ellipse ellipse = (Ellipse)e.Data.GetData(typeof(Ellipse));
        ((ObservableCollection<Checker>)DragSource.ItemsSource).Remove(ellipse.DataContext as Checker); 
        ((ObservableCollection<Checker>)target.ItemsSource).Add(ellipse.DataContext as Checker); 
    } 

коллекции Checkers описываются следующим образом: (Обратите внимание, что они являются itemscontrols ItemsSource:

public class Pipe  
{    
    private ObservableCollection<Checker> checkers;
    public ObservableCollection<Checker> Checkers
    {
        get 
        {
            if (checkers == null)
                checkers = new ObservableCollection<Checker>();
            return checkers; 
        }            
    }        
}

после события ItemsControl_Drop результат состоит в том, что только удаление обновило пользовательский интерфейс, но добавление в целевое добавление не произошло (я ожидаю, что в левом элементе появится новый элемент, который я назвал Добавить, на его ресурс:

Другая визуальная помощь:

enter image description here

Есть идеи?

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Мне кажется, я знаю, что происходит.Могу поспорить, что Pipes [] не является коллекцией ObservableCollection.Попробуйте это с Pipe1 и Pipe2.Удалить из Pipe1 и добавить в Pipe2.

1 голос
/ 10 марта 2012

Возможно проблема в том, что вы добавляете в ItemsSource ItemsControl, а не прямо в Pipes [#]. Checkers.Я заметил, что метод удаления - это удаление из DragSource.ItemsSource.Возможно, у вас есть DragTargetControl, к которому нужно добавить ItemsSource, который обновит привязку.В том случае, если вы делаете это, вы можете отменить привязку, если приведете источник связанных элементов к коллекции ObservableCollection.

0 голосов
/ 10 марта 2012

получается, что элемент пользовательского интерфейса как-то теряет свою ссылку, если вы удаляете его из одной наблюдаемой коллекции перед добавлением в другую,

, поэтому я добавил эллипс к цели, а затем удалил его из источника.

    private void ItemsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ItemsControl control = (ItemsControl)sender;
        UIElement element = control.InputHitTest(e.GetPosition(control)) as UIElement;

        if (element != null && (element is Ellipse))
        {
            Ellipse ellipse = element as Ellipse;
            DragSource = control;
            DragDrop.DoDragDrop(ellipse, ellipse, DragDropEffects.Move);
        }
    }

    private void ItemsControl_Drop(object sender, DragEventArgs e)
    {
        ItemsControl target = (ItemsControl)sender;
        Ellipse ellipse = (Ellipse)e.Data.GetData(typeof(Ellipse));
        ObservableCollection<Checker> collection = target.ItemsSource as ObservableCollection<Checker>;
        Checker checker = ellipse.DataContext as Checker;
        collection.Add(checker);
        ((ObservableCollection<Checker>)DragSource.ItemsSource).Remove(ellipse.DataContext as Checker);

    }         
...