riferimento oggetto non è impostato a un'istanza di un oggetto repository
-
22-09-2019 - |
Domanda
sto ottenendo un XAMLParseException che è veramente coprendo un'altra eccezione. Ecco parte del stacktrace:
Message=Object reference not set to an instance of an object.
Source=AssignmentOrganizer
StackTrace:
at AssignmentOrganizer.MainWindow..ctor() in C:\Users\Mohit\Documents\Visual Studio 2010 \Projects\AssignmentOrganizer\AssignmentOrganizer\MainWindow.xaml.cs:line 29
Ecco linea 29:
lvwMain.ItemsSource = _assignmentRepo.ListAssignments();
Dove lvwMain è un ListView e _assignmentsRepo è un IAssignmentRepository dichiarato come:
IAssignmentRepository _assignmentRepo;
E 'qui che si verifica l'errore. Sto usando il modello Chiunque repository disposti a prendere una congettura?
Ecco la mia XAML:
<Window x:Class="AssignmentOrganizer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="MainWindow" Height="518" Width="755">
<DockPanel>
<Menu DockPanel.Dock="Top">
</Menu>
<ToolBar DockPanel.Dock="Top">
</ToolBar>
<StatusBar DockPanel.Dock="Bottom">
</StatusBar>
<Grid DockPanel.Dock="Left" Width="150">
<Grid.RowDefinitions>
<RowDefinition Height="259*" />
<RowDefinition Height="259*" />
</Grid.RowDefinitions>
</Grid>
<Grid DockPanel.Dock="Right" Width="150">
</Grid>
<Grid>
<ListView x:Name="lvwMain">
<ListView.View>
<GridView>
<GridViewColumn Header="Title" Width="125" />
<GridViewColumn Header="Due" Width="75" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</DockPanel>
Soluzione
nel costruttore, assicuratevi di mettere la chiamata InitializeComponent
prima di fare qualsiasi altra logica costruttore.
public MainWindow()
{
// Do this first.
InitializeComponent();
// Now do the rest of the constructor.
...
lvwMain.ItemsSource = _assignmentRepo.ListAssignments();
...
}
Altri suggerimenti
Credo che il problema sia con metodo "ListAssignments ()". Alcuni degli elementi della collezione restituita da questo metodo è nullo, e quando il controllo tenta di associare tutti gli elementi (aspettavano tutti di essere nullo NON) getta un'eccezione per un oggetto nullo.
provare questo ...
lvwMain.ItemsSource = _assignmentRepo.ListAssignments().where(item=>item!=null).ToList();
idealmente, ListAssignments () dovrebbero ignorare oggetti nulli. Ma si può provare questo sbarazzarsi di eccezione.
Si potrebbe anche ottenere questa eccezione è lvwMain è nullo.
Sembra che _assignmentRepo
è null
perché non hai mai assegnato ad esso. La linea
IAssignmentRepository _assignmentRepo;
dichiara una _assignmentRepo
variabile che è un riferimento ad un oggetto che implementa IAssignmentRepository
ma in realtà non istanziare un oggetto. Ad un certo punto nel codice hai bisogno di una linea come
_assignmentRepo = new AssignmentRepository();
dove AssignmentRepository
è una classe che implementa IAssignmentRepository
. Naturalmente, è possibile dichiarare e creare un'istanza in una riga:
IAssignmentRepository _assignmentRepo = new AssignmentRepository();
Ci sono altre opzioni, come
_assignmentRepo = RepositoryFactory.CreateRepository<AssignmentRepository>();
Un modo molto semplice per verificare questo è quello di impostare un punto di interruzione sulla linea incriminata, avviare il debugger ed eseguire fino a colpire il punto di interruzione, e quindi passare il mouse sopra _assignmentRepo
. Poi un po 'suggerimento verrà in su e si può vedere se è davvero _assignmentRepo
null
.
Se si sta omettendo un dettaglio e si dispone in effetti _assignmentRepo
definitivamente assegnato allora l'unica altra possibilità è che lvmMain
è nullo. Non ci ha dato informazioni sufficienti per dedurre il perchè questo potrebbe essere il caso.