UWP TreeView привязка данных и отражающие изменения - PullRequest
0 голосов
/ 03 июня 2019

Отражает ли UWP TreeView изменения в элементах путем перетаскивания в связанный с ним ItemsSource из ВМ?Например, я связываю TreeView со списком VM ObservableCollection.Когда я добавляю некоторые элементы, выполняя команду из ВМ, которая заполняет эту коллекцию новыми элементами, они отображаются в TreeView UI.Однако, если я перетаскиваю элемент внутри TreeView, нижележащий список не меняется?Что я делаю неправильно?Должен ли TreeView обновлять и наблюдать коллекцию на основе моих действий?

Вот моя ВМ:

public class MySampleViewModel : MyBase 
{
    public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();

    public ICommand MyCommand { get; }

    public ICommand ChangeCommand { get; }

    public MySampleViewModel()
    {
        AddFilesFolders();
    }

    private void AddFilesFolders()
    {
        FolderInfo ff1 = new FolderInfo();
        ff1.FolderName = "Folder " + DateTime.Now.ToString();
        ff1.IsFolder = true;
        ff1.subFolders = new ObservableCollection<FolderInfo>();

        storageFolders.Add(ff1);

        FolderInfo ffkeko = new FolderInfo();
        ffkeko.FolderName = "subitem" + DateTime.Now.ToString();
        ffkeko.subFolders = new ObservableCollection<FolderInfo>();

        ff1.subFolders.Add(ffkeko);

        FolderInfo ff = new FolderInfo();
        ff.FolderName = "servername " + DateTime.Now.ToString();
        ff.subFolders = new ObservableCollection<FolderInfo>();

        storageFolders.Add(ff);
    }
}

public class MyBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class FolderInfo : MyBase
{
    private string _FolderName;
    public string FolderName
    {
        get { return _FolderName; }
        set
        {
            if (_FolderName != value)
            {
                _FolderName = value;
                OnPropertyChanged("FolderName");
            }
        }
    }

    private bool _IsFolder;
    public bool IsFolder
    {
        get { return _IsFolder; }
        set
        {
            if (_IsFolder != value)
            {
                _IsFolder = value;
                OnPropertyChanged("IsFolder");
            }
        }
    }

    public ObservableCollection<FolderInfo> subFolders { get; set; } = new ObservableCollection<FolderInfo>();

    public override string ToString()
    {
        return FolderName;
    }
}

А вот мой XAML для TreeView:

<localdata:MyTreeView 
x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
Style="{StaticResource TreeViewStyle1}"
/>

1 Ответ

0 голосов
/ 03 июня 2019

Проблема заключается в том, что вы фактически назначаете новый экземпляр ObservableCollection<FolderInfo> свойству subFolders, когда есть изменение, но привязка данных привязана к предыдущему экземпляру, поэтому он не наблюдает это изменение. Есть два решения этой проблемы:

1) Измените экземпляр и вызовите событие PropertyChanged:

private ObservableCollection<FolderInfo> _subFolders = new ObservableCollection<FolderInfo>();
public ObservableCollection<FolderInfo> subFolders
{
   get => _subFolders;
   set
   {
      _subFolders = value;
      OnPropertyChanged();
   }
}

2) Вместо назначения нового экземпляра очистите исходный и просто добавьте новые элементы:

Так что вместо:

ff.subFolders = new ObservableCollection<FolderInfo>();
ff.subFolders.Add(something);

Вы будете делать:

ff.subFolders.Clear();
ff.subFolders.Add(something);
...