Пользовательский интерфейс не будет обновляться при добавлении элемента в коллекцию ObservableCollection с помощью команды (WPF, C#)

У меня есть TreeView, где я хочу добавить элемент правой кнопкой мыши. Поэтому я использую команду, чтобы вставить новый элемент. Проблема в том, что добавление / удаление элементов не будет отражено в пользовательском интерфейсе, и я не знаю почему.

ObersavableCollections хранятся в свойстве в моем MainWindow

public static ObservableCollection<PlantObject> PlantObjects { get; set; }

Код работает так, как я хочу, поэтому, если я проверю свойство и сам элемент, он будет добавлен, но TreeView не будет отражать изменения. Это можно показать, установив пустое значение ItemsSource для TreeView, а затем снова значение PlantObjects, которое затем отображает добавленный элемент.

Я почти уверен, что проблема в том, что я добавляю элемент в свойство "родители". Но я не знаю, как это решить.

Вы можете увидеть мой Xaml и мой класс ниже. NotifyPropertyChanged реализовано.

Спасибо за любой совет.

XAML

<TreeView Name="ContextTreeView" Margin="0,9.8,0.8,5" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Source={x:Static local:MainWindow.PlantObjects} }">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.Resources>
            <HierarchicalDataTemplate   DataType="{x:Type local:PlantObject}" ItemsSource="{Binding PlantObjects}" >
                <StackPanel Orientation="Horizontal">
                    <StackPanel.ContextMenu>
                        <ContextMenu >
                            <MenuItem Header="Delete" Name="MenuItem_DeleteContextType" Command="{Binding DeleteContextTypeCommand}"/>
                            <MenuItem Header="Insert new object above" Name="ContextMenuItem_InsertAbovePlantObject" Command="{Binding InsertAboveCommand}"/>
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                    <TextBlock Text="{Binding Name}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

Мои занятия

public class PlantObject : INotifyPropertyChanged
{
    public PlantObject()
    {
        CreateInsertAboveCommand();
    }

    private bool _IsSelected;
    private PlantObject parent;
    private string name;

    public byte[] ParentID { get; set; }
    public byte[] ChildID { get; set; }
    public byte[] ObjectID { get; set; }

    private ObservableCollection<PlantObject> plantObjects = new ObservableCollection<PlantObject>();

    public PlantObject Parent
    {
        get
        {
            return parent;
        }

        set
        {
            if (value != parent)
            {
                parent = value;
                NotifyPropertyChanged();
            }
        }
    }

    public string Name
    {
        get
        {
            return name;
        }

        set
        {
            if (value != name)
            {
                name = value;
                NotifyPropertyChanged();
            }
        }
    }

    public ObservableCollection<PlantObject> PlantObjects
    {
        get { return plantObjects; }
        set
        {
            //ignore if values are equal
            if (value == plantObjects) return;

            plantObjects = value;
            NotifyPropertyChanged();
        }
    }

    public bool IsSelected
    {
        get { return _IsSelected; }
        set
        {
            if (_IsSelected == value) return;
            _IsSelected = value;
            NotifyPropertyChanged();
        }
    }

    public int? GetPosition(PlantObject plantObject)
    {
        int count = 0;

        foreach (var childObject in this.plantObjects)
        {
            if (plantObject == childObject)
            {
                return count;
            }
            count++;
        }
        return null;
    }

    protected void Insert(int position, PlantObject plantObject)
    {
        Parent.PlantObjects.Insert(position, plantObject);
    }

    protected void Remove(PlantObject plantObject)
    {

     Parent.PlantObjects.RemoveAt(Parent.PlantObjects.IndexOf(plantObject));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #region commands


    #region InsertAbove Command
    public ICommand InsertAboveCommand
    {
        get;
        internal set;
    }

    private bool CanExecuteInsertAboveCommand()
    {
        return true;
    }

    private void CreateInsertAboveCommand()
    {
        InsertAboveCommand = new RelayCommand(InsertAbove);
    }

    public void InsertAbove(object obj)
    {
        //this.IsSelected = true;

        if (this.parent == null)
        {    //highest level

            MainWindow.PlantObjects.Insert(MainWindow.PlantObjects.IndexOf(this), new PlantObject {IsSelected = true, Parent = this.Parent });
            return;
        }

        int position = this.parent.GetPosition(this) ?? default(int);

        PlantObject newPlantObejct = new PlantObject { Parent = this.Parent, IsSelected = true };
        this.Insert(position, newPlantObejct);
    }

    #endregion

    #endregion
}

0 ответов

Другие вопросы по тегам