2010-01-24 2 views
1

Я получаю исключение XAMLParseException, которое действительно скрывает другое исключение. Вот часть 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

Вот строка 29:ссылка на объект не установлена ​​в экземпляр репозитория объекта

lvwMain.ItemsSource = _assignmentRepo.ListAssignments(); 

Где lvwMain является ListView и _assignmentsRepo является IAssignmentRepository объявлен как:

IAssignmentRepository _assignmentRepo; 

То есть, где происходит ошибка , Я использую шаблон репозитория. Любой, кто хочет угадать?
Вот моя 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> 

ответ

3

В своем конструкторе убедитесь, что вы положили вызов InitializeComponent перед выполнением любой другой логики конструктора.

public MainWindow() 
{ 
    // Do this first. 
    InitializeComponent(); 

    // Now do the rest of the constructor. 
    ... 
    lvwMain.ItemsSource = _assignmentRepo.ListAssignments(); 
    ... 
} 
0

Похоже _assignmentRepo это null, потому что вы никогда не присвоено. Линия

IAssignmentRepository _assignmentRepo; 

объявляет переменную _assignmentRepo, которая является ссылкой на объект, который реализует IAssignmentRepository, но это не на самом деле экземпляр такого объекта. В какой-то момент в вашем коде вам нужно строку

_assignmentRepo = new AssignmentRepository(); 

где AssignmentRepository это класс, который реализует IAssignmentRepository. Конечно, вы можете объявить и создать экземпляр в одной строке:

IAssignmentRepository _assignmentRepo = new AssignmentRepository(); 

Есть и другие варианты, такие как

_assignmentRepo = RepositoryFactory.CreateRepository<AssignmentRepository>(); 

очень простой способ проверить это, чтобы установить точку останова на строку, вызвавшую, старт отпустите отладчик и запустите, пока вы не нажмете точку останова, а затем наведите указатель мыши на _assignmentRepo. Затем появится небольшая подсказка, и вы увидите, действительно ли _assignmentRepo действительно null.

Если вы опускаете деталь, и у вас на самом деле определенно назначается _assignmentRepo, тогда единственная возможная возможность заключается в том, что lvmMain - null. Вы не дали нам достаточно информации, чтобы понять, почему это может быть так.

+0

Я попытался назначить его в AssignmentRepository. Но _assignmentRepo не был нулевым, как я узнал из точки останова. –

+0

Если я удалю строку кода, которая устанавливает источник элемента списка, код работает очень хорошо. –

+0

@Mohit Deshpande: Если вы уверены, что присвоили '_assignmentRepo', вам нужно также проверить' lvmMain'. – jason

0

Я думаю, что проблема связана с методом «ListAssignments()». Некоторые элементы в коллекции, возвращаемые этим методом, равны null, и когда элемент управления пытается связать все элементы (ожидая, что все будут NON null), он генерирует исключение для нулевого объекта.

попробовать это ...

lvwMain.ItemsSource = _assignmentRepo.ListAssignments().where(item=>item!=null).ToList(); 

идеально, ListAssignments() должны игнорировать нулевые объекты. Но вы можете попробовать это, чтобы избавиться от исключения.

+0

Трассировка стека не отображает исключение как брошенное внутри 'ListAssignments'. – jason

+0

Это не так. Он отлично подходит для метода возврата коллекции с некоторыми нулевыми элементами в ней. Поэтому в ListAssignments() нет проблем. Исключение генерируется, когда эта коллекция назначается ItemSource, поскольку она будет перебирать каждый элемент (ожидая, что все будут не равными нулю) и создать ListItem для каждого. –

+0

Тогда вводить в заблуждение, чтобы сказать, что проблема связана с 'ListAssignments'. – jason

0

Вы также получите это исключение: lvwMain имеет значение null.