В visualStudio не могу найти все свойства объекта

1

Это вопрос о том, как использовать Visual Studio для выяснения свойств и методов объекта - чтобы выяснить, как использовать объект.

На изображении ниже в окне просмотра я вижу все свойства v2 включая IsExpanded. Однако, когда я набираю "точку", intellisense появляется с другим набором свойств (и если я пытаюсь использовать v2.IsExpanded в моем коде, я получаю сообщение об ошибке).

Пожалуйста, вы можете просто оставить ответ. (Я не уверен, что это ошибка, или я незнаю.)

(Я также разместил код для моего проекта (его приложение WPF), но я не считаю его соответствующим.)

Изображение 174551

<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;

        }
    }



}
  • 0
    Вы пробовали x:name ? Иногда это работает для меня вместо этого.
  • 0
    Спасибо @ Бонзо. Я попробовал - без улучшения, хотя я боюсь.
Теги:
visual-studio-2012

3 ответа

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 [] один раз.

  • 0
    Большое спасибо за объяснение. Я не понимал, почему в окне просмотра было указано, что v2 тип System.Windows.Controls.TreeViewItem но это не позволило мне создать переменную этого типа. В любом случае кастинг сработал.
  • 0
    Окно просмотра Visual Studio извлекает некоторые рефлексы, чтобы определить детали объектов. Вы можете сделать то же самое в своем коде с помощью функций, таких как GetType (). Еще до того, как вы его приведете, объект является TreeViewItem, но он сохраняется в объекте.
1

Я не знаком с WPF. В общем, Visual Studio не смог отобразить intellisense для объекта.

Изображение 174551

В вашем случае Tree1.Items[0] является объектом. Если вы хотите intellisense, вам нужно сначала передать его соответствующему объекту.

Например,

Изображение 174551

Примечание: Tree1.Items[0] может не быть TreeViewItem, потому что я не знаю WPF TreeView. Надеюсь, вы поняли эту идею.

  • 0
    И именно поэтому я всегда был против var !
  • 0
    Это не про ключевое слово var. var v2 = Tree1.Items[0] as TreeViewItem; также будет отображать intellisense.
Показать ещё 2 комментария
0

Вы должны помнить, что С# набирается в compiletime. И в то время это его тип Object. Когда вы смотрите на время выполнения, вы видите текущий тип, который находится в Tree1.Items [0], но для компилятора он может быть любым типом, являющимся объектом, и он разрешает любой метод и свойство, не определенные в Object.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню