在visual Studio中找不到对象的所有属性

时间:2014-07-23 18:40:58

标签: c# visual-studio-2012

这是一个关于如何使用Visual Studio来找出对象的属性和方法的问题 - 以帮助弄清楚如何使用该对象。

在下图中,在观察窗口中,我可以看到v2的所有属性,包括IsExpanded。但是当我输入一个' dot' intellisense弹出一组不同的属性(如果我在我的代码中尝试使用v2.IsExpanded,我会收到错误)。

请你能简单地保持答案。 (我不确定它是一个错误还是我无知。)

(我还发布了我的项目代码(它是一个WPF应用程序),但我认为它不相关。)

intellisense

<Window x:Class="ObjElements1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TreeView Name="Tree1">
                <TreeViewItem Header="Tree1.1"></TreeViewItem>
                <TreeViewItem Header="Tree1.2">
                    <TreeViewItem Header="Tree1.2.1">
                        <TreeViewItem Header="Tree1.2.1.1">daslkjdlak</TreeViewItem>
                    </TreeViewItem>
                    <TreeViewItem Header="Tree1.2.1"></TreeViewItem>
                </TreeViewItem>
                <TreeViewItem Header="Tree1.3"></TreeViewItem>
            </TreeView>

        </StackPanel>
    </Grid>
</Window>


namespace ObjElements1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var v2 = Tree1.Items[0];



            //var v3 = v2.IsExpanded;
            //var v3 = v2.IsExpandedProperty;

        }
    }



}

3 个答案:

答案 0 :(得分:1)

我不熟悉WPF。通常,Visual Studio无法显示对象的智能感知。

enter image description here

在您的情况下,Tree1.Items[0]是一个对象。如果你想要intellisense,你需要先将它强制转换为适当的对象。

例如,

enter image description here

注意: Tree1.Items[0]可能不是TreeViewItem,因为我不知道WPF TreeView。我希望你明白这一点。

答案 1 :(得分:0)

您必须记住在编译时键入c#。那时它的类型是Object。 当您查看运行时,您会看到Tree1.Items [0]中的当前类型,但对于编译器,它可以是任何类型的Object,并允许在Object上定义任何方法和属性。

答案 2 :(得分:0)

IntelliSense不知道Tree1.Items中的项目类型 - 它们都存储为对象。如果你想访问存储在那里的对象的属性,你就会明确地将它们从Object中转出来:

MyType v2 = (MyType)Tree1.Items[0];
v2. (...)

其中MyType是Tree1.Items [0]的实际类型。

附录: 在处理您无法完全控制的对象集合时的最佳实践(某些其他组件或方法可以在Tree1中添加/删除某些内容),您应该在尝试将其强制转换为特定类型之前验证该类型。无论哪种方式都有效:

MyType v2 = Tree1.Items[0] as MyType;
if (v2 != null) {    
    //Do something
}
else {
    //Error
}

或者:

if (Tree1.Items[0] is MyType) {
    v2 = (MyType)Tree1.Items[0];
    //Do something...
}
else {
    //Error
}

第一种方法的好处是只能调用Items []索引器一次。