ссылка на объект не установлена ​​для экземпляра хранилища объектов - PullRequest
1 голос
/ 24 января 2010

Я получаю исключение XAMLParseException, которое действительно скрывает другое исключение. Вот часть трассировки стека:
Message=Object reference not set to an instance of an object.<br> Source=AssignmentOrganizer<br> StackTrace:<br> 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>

Ответы [ 4 ]

3 голосов
/ 25 января 2010

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

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

    // Now do the rest of the constructor.
    ...
    lvwMain.ItemsSource = _assignmentRepo.ListAssignments();
    ...
}
0 голосов
/ 24 января 2010

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

попробуйте это ...

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

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

0 голосов
/ 24 января 2010

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

0 голосов
/ 24 января 2010

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

IAssignmentRepository _assignmentRepo; 

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

_assignmentRepo = new AssignmentRepository();

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

IAssignmentRepository _assignmentRepo = new AssignmentRepository();

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

_assignmentRepo = RepositoryFactory.CreateRepository<AssignmentRepository>();

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...