当使用Command(WPF,C#)向ObservableCollection添加项时,UI不会更新

时间:2018-01-09 12:39:38

标签: c# wpf binding treeview icommand

我有一个TreeView,我想在其中添加一个右键单击的项目。因此我使用命令来插入新项目。 现在的问题是添加/删除项目不会反映在用户界面中,我也不知道为什么。

ObersavableCollections保存在我的MainWindow

中的属性中
public static ObservableCollection<PlantObject> PlantObjects { get; set; }

代码以我想要的方式工作,因此如果我检查属性和项目本身,它将被添加,但TreeView将不会反映更改。这可以通过将TreeView的ItemsSource设置为null然后再次设置为PlantObjects来显示,然后PlantObjects显示添加的项目。

我很确定问题是我在物业中添加了一个物品&#34;父母&#34;。但我不知道如何解决它。

您可以在下面看到我的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 个答案:

没有答案