В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Причина, вызываемая этим конкретным исключением, заключается в том, что содержимое элемента применяется к коллекции Items ListView. Таким образом, XAML инициализирует ListView одним локальным: ImageView в своей коллекции Items. Но при использовании ItemsControl вы должны использовать либо свойство Items, либо свойство ItemsSource, вы не можете использовать оба метода одновременно. Следовательно, когда атрибут ItemsSource обрабатывается, генерируется исключение.
Вы можете узнать, какое свойство будет обладать содержимым элемента, ища атрибут ContentPropertyAttribute в классе. В этом случае определяется выше в иерархии классов, в ItemsControl:
[ContentPropertyAttribute("Items")]
. Предполагалось, что в представлении ListView должен быть установлен локальный: ImageView, поэтому исправление должен явно указывать свойство, которое должно быть установлено.
Исправить XAML, и исключение исчезнет:
<ListView Name="ListViewImages"
SelectionMode="Single"
ItemsSource="{Binding}">
<ListView.View>
<local:ImageView />
</ListView.View>
</ListView>
Отсутствует тег <ListView.View>
.
Возможно, не такой полезный ответ, но у меня была та же проблема при изменении порядка столбцов и ошибка, подобная той, что приведена в следующем примере. Имея много столбцов, я переупорядочил их и как-то вставил один после закрытия тега /DataGrid.Columns
:
<DataGridTemplateColumn x:Name="addedDateColumn" Header="Added Date" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=AddedDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGridTemplateColumn x:Name="rowguidColumn" Header="rowguid" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=rowguid}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid>
В любом случае, потеряно полчаса из-за этого. Надеюсь, это поможет другим.
Я просто столкнулся с ОЧЕНЬ коварным примером этой проблемы. Мой оригинальный фрагмент был намного сложнее, что затрудняло просмотр ошибки.
<ItemsControl
Foreground="Black" Background="White" Grid.IsSharedSizingScope="True"
x:Name="MyGrid" ItemsSource="{Binding}">
>
<ItemsControl.ItemsPanel>
<!-- All is fine here -->
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<!-- All is fine here -->
</ItemsControl.ItemTemplate>
<!-- Have you caught the error yet? -->
</ItemsControl>
Ошибка? Дополнительно> после начального открытия <ItemsControl>
тега! <
был применен к встроенной коллекции Items. Когда DataContext был позже установлен, мгновенная crashola. Поэтому при отладке этой проблемы обратите внимание не только на ошибки, связанные с вашими конкретными детьми ItemsControl.
Исключение
Элемент коллекции должен быть пуст перед использованием ItemsSource.
blockquote>Это исключение возникает, когда вы добавляете элементы в
ItemsSource
из разных источников. Итак, убедитесь, что вы случайно не пропустили тег, неправильно разместили тег, добавили дополнительные теги или неправильно указали тег.<!--Right--> <ItemsControl ItemsSource="{Binding MyItems}"> <ItemsControl.ItemsPanel.../> <ItemsControl.MyAttachedProperty.../> <FrameworkElement.ActualWidth.../> </ItemsControl> <!--WRONG--> <ItemsControl ItemsSource="{Binding MyItems}"> <Grid.../> <Button.../> <DataTemplate.../> <Heigth.../> </ItemsControl>
Пока
ItemsControl.ItemsSource
уже установлен черезBinding
, другие элементы (сетка, кнопка, ...) не могут быть добавлены к источнику. Однако, хотяItemsSource
не используется, разрешен следующий код:<!--Right--> <ItemsControl> <Button.../> <TextBlock.../> <sys:String.../> </ItemsControl>
обратите внимание на отсутствующую часть
ItemsSource="{Binding MyItems}"
.
В моем случае это был просто дополнительный StackPanel внутри ListView:
<ListView Name="_details" Margin="50,0,50,0">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
<TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
<TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
<Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
<ItemsControl ItemsSource="{Binding Items}"/>
</StackPanel>
</StackPanel>
</ListView>
Становится:
<ListView Name="_details" Margin="50,0,50,0">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
<TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
<TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
<Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
<ItemsControl ItemsSource="{Binding Items}"/>
</StackPanel>
</ListView>
и все в порядке.
Хранить столбцы шаблонов внутри DataGrid.Columns. Это помогло мне решить эту проблему.
Ссылка: DataGridTemplateColumn: коллекция элементов должна быть пуста перед использованием ItemsSource.
Остерегайтесь опечаток! У меня было следующее
<TreeView ItemsSource="{Binding MyCollection}">
<TreeView.Resources>
...
</TreeView.Resouces>>
</TreeView>
(Обратите внимание на tailing>, который интерпретируется как контент, поэтому вы дважды устанавливаете содержимое ... Приняли меня некоторое время:)
Я тоже по другому сценарию.
<ComboBox Cursor="Hand" DataContext="{Binding}"
FontSize="16" Height="27" ItemsSource="{Binding}"
Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} / {1}">
<Binding Path="MemberName"/>
<Binding Path="Phone"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox>
Теперь, когда вы закончите с отсутствующим тегом Control.ItemTemplate, все становится нормальным:
<ComboBox Cursor="Hand" DataContext="{Binding}"
FontSize="16" Height="27" ItemsSource="{Binding}"
Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} / {1}">
<Binding Path="MemberName"/>
<Binding Path="Phone"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
<ComboBox.ItemTemplate>
</ComboBox>
<ListView>
отсутствием <ListView.ItemTemplate>
или <ListBox>
отсутствующим <ListBox.ItemTemplate>
.
– Grant Winney
24 July 2014 в 18:54
<ItemsControl>
.
– RHaguiuda
16 February 2017 в 11:16
У меня была такая же ошибка некоторое время в несколько ином сценарии. У меня было
<wpftoolkit:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Accounts}" >
<wpftoolkit:DataGridTextColumn
Header="Account Name"
Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>
, которое я зафиксировал как
<wpftoolkit:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Accounts}" >
<wpftoolkit:DataGrid.Columns>
<wpftoolkit:DataGridTextColumn
Header="Account Name"
Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid.Columns>
</wpftoolkit:DataGrid>
У меня была такая же ошибка в другом сценарии
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl>
. Решением было добавить тег ItemsControl.ItemsPanel
до ItemsPanelTemplate
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
У меня была эта ошибка, когда я попытался применить контекстные меню к своему TreeView
. Эти попытки оказались в плохом XAML, который каким-то образом скомпилирован:
<TreeView Height="Auto" MinHeight="100" ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}"
ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
ContextMenu="">
<TreeView.ItemContainerStyle>
...
Обратите внимание на проблемную строку: ContextMenu="">
. Я не знаю, почему он скомпилирован, но я решил, что стоит упомянуть в качестве причины для этого загадочного сообщения об исключении. Как сказал Armentage, внимательно осмотрите XAML, особенно в местах, которые вы недавно редактировали.
Мое было с Datagrid Style. Если вы оставите теги <DataGrid.RowStyle>
вокруг стиля, вы получите эту проблему. Странно, что это сработало какое-то время. Вот плохой код.
<DataGrid Name="DicsountScheduleItemsDataGrid"
Grid.Column="0"
Grid.Row="2"
AutoGenerateColumns="false"
ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
<Style TargetType="DataGridRow">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
и good
<DataGrid Name="DicsountScheduleItemsDataGrid"
Grid.Column="0"
Grid.Row="2"
AutoGenerateColumns="false"
ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</DataGrid.RowStyle>
В моем случае он не использовал DataTemplate для ItemsControl.
Old:
<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
<StackPanel Orientation="Horizontal">
<TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
<Label Content="{Binding Path=Property2}"/>
</StackPanel>
</ItemsControl>
Новое:
<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
<Label Content="{Binding Path=Property2}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
У меня была такая же ошибка. Проблема заключалась в дополнительном символе «>», добавленном по ошибке между тегами & lt; /ComboBox.SelectedValue> и & lt; / ComboBox & gt;:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
>
</ComboBox>
, и здесь приведен правильный код:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
</ComboBox>
Говорить ответ по-разному; убедитесь, что отсутствуют отсутствующие родительские узлы или неправильные узлы.
Нет родителя (или неправильного родителя) для дочернего узла ItemsPanelTemplate
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
...
</ItemsControl>
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
...
</ItemsControl>
<DataGrid.Columns>
и имел столбцы шаблонов непосредственно внутри <DataGrid>
. Нечетная ошибка для этого.
– Andrew Grothe
12 July 2016 в 12:44