【发布时间】:2019-10-17 04:06:46
【问题描述】:
使用 UWP TreeView 并处理我需要根据其属性(或类型)实现将一个 TreeView 项拖放到另一个的方案。 例如,我在 TreeView 中有五个节点,其中三个是文件,两个是文件夹。文件项目可以放在文件夹上 - 但反之亦然。我也可以将文件项从文件夹拖到根目录,但不能将文件项放在另一个也是文件的项上。因此,您可以看到 TreeView 项的行为方式有多个用例。 想知道我可以扩展 TreeView 然后覆盖 DragEnter 和 DragLeave 方法,也许我可以检测到被拖动的底层对象和被拖放到的底层对象......但是文档令人困惑,过于笼统且缺乏。 我都检查过的示例认为 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;
}
}
Storage 文件夹只是 VM 中的 ObservableCollection:
public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();
【问题讨论】:
-
您可以通过处理 TreeView_DragItemsCompleted 事件并询问 args.Items 列表来进行验证。
-
@McNline 谢谢。我可以通过 DragItemsCompleted 事件获取我拖动的项目和我已经放弃的项目。但是我怎样才能得到我掉到(目标)上的对象?源项和目标项位于单个 TreeView 中。
-
这个问题有什么有用的答案吗? Xavier Xie 的回答对我没有帮助,因为所有可用的回调都没有执行,并且没有可能停止节点的删除。
标签: uwp drag-and-drop treeview