WPF DataGrid не удается выполнить привязку из ItemsSource

Я смотрю на это уже несколько часов, но не могу понять ... Я успешно привязал «Вопросы» к ItemsSource. Вопросы - это ObservableCollection, содержащая объекты QuestionVM.

По какой-то причине текстовый столбец с заголовком «Вопрос» не может быть привязан к свойству «Вопрос» внутри «Вопросов».

    <DataGrid ItemsSource = "{Binding Questions}" AutoGenerateColumns = "False" SelectedItem = "{Binding SelectedQuestion, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Header = "Question" Binding = "{Binding Question}" Width = "*"/>
            <DataGridTemplateColumn Width = "100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content = "Delete"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width = "100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content = "Edit"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Вот часть класса QuestionVM со свойствами.

public class QuestionVM
{
    private Question _question;
    public string Question { get { return _question.Question1; } set { _question.Question1 = value; } }
    public string Category { get { return _question.Category; } set { _question.Category = value; } }
    public ObservableCollection<AnswerVM> Answers { get; set; }
}

Я должен иметь возможность связать свойство Question правильно? Почему я не могу этого сделать?

Обновлено: Intellisense показывает только свойства основного контекста данных, а не свойства отдельных виртуальных машин Question внутри ObservableCollection вопросов.

        DataContext = "{Binding ExistingQuestions, Source = {StaticResource Locator}}

ExistingQuestions содержит свойства Questions, SelectedQuestion и AddQuestion. Это те, которые показывает Intellisense.

Картинки для уточнения:

WPF DataGrid не удается выполнить привязку из ItemsSource

Как видите, это не свойства QuestionVM, а основной текст данных. Он не хочет выбирать свойства из коллекции ObservableCollection, которую я установил как ItemsSource.

WPF DataGrid не удается выполнить привязку из ItemsSource

WPF DataGrid не удается выполнить привязку из ItemsSource

Я не думаю, что это ваша проблема, но Question, являющийся вашим основным типом поддержки и важным общедоступным свойством вашего класса, довольно сбивает с толку. Считаете QuestionDTO для типа?

zzxyz 18.10.2018 21:52

Является ли вопрос членом группы вопросов? В этом случае привязка должна быть Binding = {Binding Questions.Question}.

fussel 18.10.2018 23:45

@zzxyz Я тоже так думал. Скорее всего поменяет.

BobiSad 19.10.2018 00:29

@fussel Question - это свойство внутри QuestionVM. ItemsSource привязан к ObservableCollection из QuestionVM.

BobiSad 19.10.2018 00:30

Что вы имеете в виду под невозможностью связать? Question не отображается, или его значение не обновляется, если вы измените его в ViewModel?

Rekshino 19.10.2018 08:43

Вопрос вообще не отображается. Intellisense тоже не подхватывает. Он показывает мне только свойства основного контекста данных для привязки.

BobiSad 19.10.2018 10:38

@BobiSad Иногда такое случается, и вы ничего не можете сделать, кроме как отправить отчет об ошибке.

Sir Rufo 19.10.2018 10:43

Не могли бы вы показать код, на который ссылается ваш DataContext. Как и где определяется ресурс Locator?

fussel 19.10.2018 23:27

Я как-то решил это сейчас. Я не помню точно, в чем была причина, но Locator всегда возвращал новую виртуальную машину. Поэтому, если бы я хотел использовать данные существующей виртуальной машины, это не сработало бы, поскольку она возвращает совершенно новую. Я не уверен, возвращали ли привязки ошибку раньше, но теперь это не так. А проблема с Intellisense - это просто глупость Intellisense.

BobiSad 20.10.2018 12:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
148
1

Ответы 1

Обновленный ответ

Если объект не отображается в Intellisense, это может быть связано с пространством имен, в котором создается объект. Убедитесь, что объекты объявлены в одном пространстве имен, или попробуйте добавить пространство имен объекта Question в представление.

Пример добавления пространства имен в представление

xmlns:helper = "clr-namespace:Mynamespace.Myclass"

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

Кордиэлемент

Кроме того, бессмысленно наследовать от DependencyObject, не модель, а модель представления должна реализовывать INotifyPropertyChanged.

Clemens 19.10.2018 08:16

@Clemens С DependencyObject вы правы, но это не проблема, если модель реализует INotifyPropertyChanged. Это было бы очень редко, но возможно. Взгляните на пример приложения Microsoft github.com/Microsoft/BikeSharing360_MobileApps/blob/master/s‌ rc /…

Sir Rufo 19.10.2018 09:13

@SirRufo Конечно, это нормально, что модель реализует INPC, но здесь важнее, чем это делает модель представления.

Clemens 19.10.2018 11:58

Другие вопросы по теме