C # Threadpool создания элемента пользовательского интерфейса - PullRequest
1 голос
/ 30 декабря 2010

Я обновляю список с помощью databind, и один из столбцов, которые я пытаюсь вставить, это флажок. Это обновление обрабатывается пулом потоков, и я могу вставлять данные в порядке, за исключением флажка. Когда я создаю флажок, он отображает xaml вместо элемента флажка. т.е.

System.Windows.Controls.Checkbox Содержимое: IsChecked: False

Определение NotesReminderViewDetails

private struct NotesRemindersViewDetails
{
    public string NoteReminderID { get; set; }
    public string NoteReminderEnterDate { get; set; }
    public string NoteReminderDueDate { get; set; }
    public string NoteReminderConents { get; set; }
    public CheckBox NoteReminderCompleted { get; set; }
}

Вот код, который я использую для обновления списка. NoteReminderType - это структура со всей информацией заметки / напоминания.

NoteReminderType noteType = noteReminder.NoteReminderDetails;

NotesRemindersViewDetails noteReminderDetails = new NotesRemindersViewDetails();
noteReminderDetails.NoteReminderID = noteType.UserFriendlyNoteReminderID.ToString();
noteReminderDetails.NoteReminderEnterDate = noteType.InsertionDate.ToShortDateString();
noteReminderDetails.NoteReminderDueDate = noteType.DueDate.ToShortDateString();
noteReminderDetails.NoteReminderConents = noteType.Description;

listViewNotesReminders.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate()
{
    noteReminderDetails.NoteReminderCompleted = new CheckBox();

    listViewNotesReminders.Items.Add(noteReminderDetails);
}));

Что мне нужно изменить, чтобы отображался флажок вместо xaml из потока пула потоков?

EDIT
Вот код xaml для просмотра списка

<ListView.View>
    <GridView>
        <GridViewColumn Header="ID" Width="20" DisplayMemberBinding="{Binding Path=NoteReminderID}" />
        <GridViewColumn Header="Entered Date" Width="Auto" DisplayMemberBinding="{Binding Path=NoteReminderEnterDate}" />
        <GridViewColumn Header="Due Date" Width="75" DisplayMemberBinding="{Binding Path=NoteReminderDueDate}" />
        <GridViewColumn Header="Note Contents" Width="300" DisplayMemberBinding="{Binding Path=NoteReminderConents}" />
        <GridViewColumn Header="Completed" Width="Auto" DisplayMemberBinding="{Binding Path=NoteReminderCompleted}" />
    </GridView>
</ListView.View>

Ответы [ 2 ]

5 голосов
/ 30 декабря 2010

Вместо того, чтобы помещать элемент пользовательского интерфейса (CheckBox) в данные для ListView, вы должны определить шаблон, чтобы вы могли отображать столбец как флажок, и просто использовать Boolean для данных. Использование CheckBox в ваших данных смешивает ваш пользовательский интерфейс и слои данных.

Обновление:

Вот пример (не проверенный) того, как создать шаблон пользовательского столбца:

<ListView.View>
    <GridView>
        <GridViewColumn Header="ID" Width="20" 
                        DisplayMemberBinding="{Binding Path=NoteReminderID}" />
        <GridViewColumn Header="Entered Date" Width="Auto" 
                        DisplayMemberBinding="{Binding Path=NoteReminderEnterDate}" />
        <GridViewColumn Header="Due Date" Width="75" 
                        DisplayMemberBinding="{Binding Path=NoteReminderDueDate}" />
        <GridViewColumn Header="Note Contents" Width="300" 
                        DisplayMemberBinding="{Binding Path=NoteReminderConents}" />
        <GridViewColumn Header="Completed" Width="Auto">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=NoteReminderCompleted}"/>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
</ListView.View>
0 голосов
/ 30 декабря 2010

Вам нужно использовать поле bool для NoteReminderCompleted вместо CheckBox.

...