Использование UWP TreeView и работа над сценариями, в которых мне нужно реализовать перетаскивание одного элемента TreeView в другой, в зависимости от его свойств (или типа).Например, у меня есть пять узлов в TreeView, три из них - файлы, два - папки.Элемент файла может быть удален в папку, но не наоборот.Я также могу перетащить элемент «Файл» из папки в корневой каталог, но не могу добавить элемент «Файл» в другой элемент, который также является «Файл».Таким образом, вы можете видеть, что есть несколько вариантов использования, как должны вести себя элементы TreeView.Мне было интересно, что я могу расширить TreeView и затем переопределить методы DragEnter и DragLeave, может быть, тогда я смогу обнаружить подстилающий объект, который перетаскивается, и подстилающий объект, который сбрасывается в ... но документация сбивает с толку, слишком общая и отсутствует.В примерах, которые я проверил, все элементы TreeView считаются равными (поэтому я могу удалить папку из файла, что недопустимо).
Вот мой TreeView:
<TreeView
x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}"
Style="{StaticResource TreeViewStyle1}"
>
<TreeView.ItemTemplate>
<DataTemplate x:DataType="localdata:FolderInfo">
<TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
А вот FolderInfoтип:
public class FolderInfo : MyBase //INotifyPropertyChanged
{
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;
}
}
Папка хранения - это просто коллекция ObservableCollection в ВМ:
public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();