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}"
/>
发布于 2019-06-03 15:05:49
问题在于,当发生更改时,您实际上是将一个新的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);
https://stackoverflow.com/questions/56427988
复制相似问题