Это вопрос о том, как использовать Visual Studio для выяснения свойств и методов объекта - чтобы выяснить, как использовать объект.
На изображении ниже в окне просмотра я вижу все свойства v2
включая IsExpanded
. Однако, когда я набираю "точку", intellisense появляется с другим набором свойств (и если я пытаюсь использовать v2.IsExpanded
в моем коде, я получаю сообщение об ошибке).
Пожалуйста, вы можете просто оставить ответ. (Я не уверен, что это ошибка, или я незнаю.)
(Я также разместил код для моего проекта (его приложение WPF), но я не считаю его соответствующим.)
<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;
}
}
}
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 [] один раз.
v2
тип System.Windows.Controls.TreeViewItem
но это не позволило мне создать переменную этого типа. В любом случае кастинг сработал.
Я не знаком с WPF. В общем, Visual Studio не смог отобразить intellisense для объекта.
В вашем случае Tree1.Items[0]
является объектом. Если вы хотите intellisense, вам нужно сначала передать его соответствующему объекту.
Например,
Примечание: Tree1.Items[0]
может не быть TreeViewItem
, потому что я не знаю WPF TreeView. Надеюсь, вы поняли эту идею.
var
!
var v2 = Tree1.Items[0] as TreeViewItem;
также будет отображать intellisense.
Вы должны помнить, что С# набирается в compiletime. И в то время это его тип Object. Когда вы смотрите на время выполнения, вы видите текущий тип, который находится в Tree1.Items [0], но для компилятора он может быть любым типом, являющимся объектом, и он разрешает любой метод и свойство, не определенные в Object.
x:name
? Иногда это работает для меня вместо этого.