【问题标题】:UWP TreeView data binding and reflecting changesUWP TreeView 数据绑定和反映变化
【发布时间】:2019-06-03 13:02:52
【问题描述】:

UWP TreeView 是否通过从 VM 拖放到关联的 ItemsSource 来反映项目的变化?例如,我将 TreeView 与 VM ObservableCollection 列表相关联。当我通过从 VM 执行命令来添加一些项目时,这些项目用新项目填充该集合,它们确实显示在 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;
    }
}

这是我的 TreeView 的 XAML:

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

【问题讨论】:

    标签: uwp drag-and-drop treeview viewmodel observablecollection


    【解决方案1】:

    问题在于,当发生更改时,您实际上是为subFolders 属性分配了一个新的ObservableCollection&lt;FolderInfo&gt; 实例,但数据绑定绑定到前一个实例,因此它不会观察到此更改。这个问题有两种解决方案:

    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);
    

    【讨论】:

    • 你有一些源代码可以确认吗?已按照您的建议对我的虚拟机添加了更改,但仍然没有更改,在树中移动项目后虚拟机没有更新...
    • 不幸的是我没有,但是如果你在 GitHub 上创建一个示例 repo,我可以检查问题是什么
    • 我明天去看看
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2018-04-13
    • 2018-06-10
    • 2018-03-20
    • 2015-10-22
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多