使用UWP TreeView并处理需要根据其属性(或类型)将一个TreeView项放到另一个项的方案。 例如,我在TreeView中有五个节点,其中三个是文件,两个是文件夹。可以将文件项放在“文件夹”上-但不能相反。我也可以将File项目从Folder拖到根目录中,但是不能将File项目拖放到也是File的另一个项目上。因此,您可以看到TreeView项目的行为方式有多个用例。 想知道我可以扩展TreeView,然后重写DragEnter和DragLeave方法,也许然后我可以检测到被拖动的底层对象和被拖放到...的底层对象,但是文档令人困惑,过于笼统且缺乏。 我所有检查过的示例都认为TreeView中的所有项目都相等(因此我可以将Folder放到File上,这是不允许的)。
这是我的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;
}
}
存储文件夹只是VM中的一个ObservableCollection:
public ObservableCollection<FolderInfo> storageFolders { get; set; } = new ObservableCollection<FolderInfo>();
答案 0 :(得分:0)
首先可以通过在DragEnter事件处理程序中调用DataPackageView.GetStorageItemsAsync方法来获取所有StorageItems。然后,IStorageItem界面具有一个IsOfType(StorageItemTypes) Method,您可以使用它来检查StorageItem是文件夹还是文件。
private async void DropBorder_DragEnter(object sender, Windows.UI.Xaml.DragEventArgs e)
{
var items = await e.DataView.GetStorageItemsAsync();
foreach (IStorageItem storageItem in items)
{
Debug.WriteLine("IsFolder: " + storageItem.IsOfType(StorageItemTypes.Folder) + " IsFile: " + storageItem.IsOfType(StorageItemTypes.File));
}
//TODO:......
}