简体   繁体   English

XAML设计器中的数据类型下拉列表未显示自定义类

[英]Datatype dropdown in XAML designer not showing custom Class

I have a TreeView with HierarchicalDataTemplate that I'm trying to bind with an ObservableCollection of custom types. 我有一个带有HierarchicalDataTemplate的TreeView,我试图与自定义类型的ObservableCollection绑定。
But the HierarchicalDataTemplate's DataType attribute's dropdown list of available types in my Namespace is incomplete, it's missing the TFolderItem custom type, but listing all the other custom types in that same namespace. 但是HierarchicalDataTemplate的DataType属性在我的命名空间中的可用类型的下拉列表不完整,它缺少TFolderItem自定义类型,但列出了该相同命名空间中的所有其他自定义类型。 The namespace is MyProject.Classes , and classes are in plain Classes folder in the project directory. 命名空间为MyProject.Classes ,类位于项目目录中的纯Classes文件夹中。
I don't understand why it's not showing in the XAML code editor dropdown. 我不明白为什么它没有显示在XAML代码编辑器下拉列表中。

public class TFolderItem
{
    /*public FolderItem(RemoteDirectoryInfo rdi, WinSCP.Session winscpSession)
    {
        RDI = rdi;
        this.WinSCPSession = winscpSession;
    }*/

    public TFolderItem(string path, WinSCP.Session winscpSession)
    {
        RDI = winscpSession.ListDirectory(path);
        this.FtpPath = path;
        this.WinSCPSession = winscpSession;
    }

    private WinSCP.Session winscpSession;

    public RemoteDirectoryInfo RDI { get; set; }

    public string FtpPath { get; set; }

    public WinSCP.Session WinSCPSession
    {
        get { return this.winscpSession; }
        set { this.winscpSession = value; }
    }

    public IList Children
    {
        get
        {
            var children = new CompositeCollection();

            var subDirItems = new List<TFolderItem>();
            var subDirFiles = new List<RemoteFileInfo>();

            foreach (RemoteFileInfo rfi in RDI.Files)
            {
                if (rfi.IsDirectory)
                {
                    subDirItems.Add(new TFolderItem(this.FtpPath + rfi.Name + "/", this.WinSCPSession));
                }
                else
                {
                    subDirFiles.Add(rfi);
                }
            }

            children.Add(new CollectionContainer
            {
                Collection = subDirItems
            });
            children.Add(new CollectionContainer
            {
                Collection = subDirFiles
            });

            return Children;
        }
    }
}

Here is the view's xaml: 这是视图的xaml:

<UserControl x:Class="MyProject2.Views.FTPTab"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MyProject2.Views"             
         xmlns:MyProject2Classes="clr-namespace:MyProject2.Classes"                 


         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TreeView  ItemsSource="{Binding FolderItems}" Height="300" Width="300">
        <TreeView.Resources >
            <HierarchicalDataTemplate DataType="" ItemsSource="{Binding Childrenx}">
                <TextBlock Text="{Binding FtpPathr}"/>
            </HierarchicalDataTemplate>
            <DataTemplate DataType=":">
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>
</Grid>

This is the viewmodel: 这是视图模型:

public class FTPTabViewModel : BindableBase
{
    public FTPTabViewModel(string host, WinSCP.Session winscpSession)
    {
        this.Host = host;
        this.FolderItems = new ObservableCollection<TFolderItem>();
        this.Session = winscpSession;            

        this.FolderItems.Add(new TFolderItem("/",Session));
    }

    private WinSCP.Session session;
    private ObservableCollection<TFolderItem> folderItems;
    private string host;

    public string Host
    {
        get { return this.host; }
        set { this.host = value; }
    }

    public WinSCP.Session Session
    {
        get { return session; }
        set { this.session = value; }
    }

    public ObservableCollection<TFolderItem> FolderItems
    {
        get { return folderItems; }
        set { SetProperty(ref this.folderItems, value); }
    }
}

It seems that x:type dropdown only displays classes with default constructor. 似乎x:type下拉列表仅显示具有默认构造函数的类。 Adding one in TFolderItem class made it display in x:type dropdown. 在TFolderItem类中添加一个使其在x:type下拉列表中显示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM