.NET WPF XAML «Ошибка пути BindingExpression:… свойство не найдено»

Я пытался привязать коллекцию объектов моего типа W3CError к элементу управления WPF ListView.

Это был хороший маленький 13 класс линии ...

Класс W3CError

    Открытый тип как ErrorOrWarning
    Публичная линия как целое число
    Public Col As Integer
    Публичное сообщение как строка
    Public MessageId As String
    Публичное объяснение в виде строки
    Публичный источник в виде строки

    Enum ErrorOrWarning
        Ошибка проверки
        ValidationWarning
    Конец Enum

Конечный класс

Это не сработало. Я получил эти ошибки привязки в окне вывода Visual Studio:

Ошибка System.Windows.Data: 39: Ошибка пути BindingExpression: свойство 'Line' не найдено в 'object' '' W3CError '(HashCode = ...)'. BindingExpression: Path = линия; DataItem = 'W3CError' (HashCode = ...); целевым элементом является TextBlock (Name = ''); Целевое свойство - «Текст» (тип «Строка»).

Ну, нет, это не собственность. Это просто публично. Я полагаю, этого недостаточно для связывания WPF?

Я заставил его работать, расширив свой класс до 69 уродливых шаблонов свойств ...

Класс W3CError

    Private _Type As ErrorOrWarning
    Private _Line As Integer
    Private _Col As Integer
    Личное _Message As String
    Private _MessageId As String
    Частное _ Explanation As String
    Частный _Source As String

    Enum ErrorOrWarning
        Ошибка проверки
        ValidationWarning
    Конец Enum

    Тип открытого свойства () As ErrorOrWarning
        Получить
            Вернуть _Type
        Конец получить
        Set (значение ByVal As ErrorOrWarning)
            _Type = значение
        Конец набора
    Конечная недвижимость

    Public Property Line () как целое число
        Получить
            Возврат _Line
        Конец получить
        Установить (значение ByVal как целое число)
            _Line = значение
        Конец набора
    Конечная недвижимость

    Публичная собственность Col () As Integer
        Получить
            Вернуться _Col
        Конец получить
        Установить (значение ByVal как целое число)
            _Col = значение
        Конец набора
    Конечная недвижимость

    Public Property Message () в виде строки
        Получить
            Вернуться _Message
        Конец получить
        Set (значение ByVal As String)
            _Message = значение
        Конец набора
    Конечная недвижимость

    Открытое свойство MessageId () As String
        Получить
            Возврат _MessageId
        Конец получить
        Set (значение ByVal As String)
            _MessageId = значение
        Конец набора
    Конечная недвижимость

    Публичное свойство Объяснение () As String
        Получить
            Возврат _ Объяснение
        Конец получить
        Set (значение ByVal As String)
            _Explanation = значение
        Конец набора
    Конечная недвижимость

    Public Property Source () в виде строки
        Получить
            Вернуться _Source
        Конец получить
        Set (значение ByVal As String)
            _Source = значение
        Конец набора
    Конечная недвижимость

Конечный класс

Есть ли способ лучше?

10.03.2009 19:56:59
Аааа ... вот почему мои привязки не работают! Спасибо.
Kieron 31.03.2009 13:30:32
Надеюсь, я избавил тебя от разочарований, Кирон.
Zack Peterson 31.03.2009 14:13:09
2 ОТВЕТА

Если бы вы использовали C #, я бы сказал, использовать автоматические свойства, но я не думаю, что они в VB.

Так что, вероятно, нет. Вы можете даже пойти дальше и заставить свой класс реализовать INotifyPropertyChanged, чтобы ваш пользовательский интерфейс знал, изменяются ли свойства.

4
10.03.2009 20:00:24
Вздор! Я бы предпочел, чтобы VB имел автоматические свойства, а не встроенный XML.
Zack Peterson 10.03.2009 20:21:54
Я полагаю, что следующая версия VB (та, которая поставляется с .NET 4.0 / Visual Studio 2010) будет иметь автоматические свойства. Сейчас не помогает, но, по крайней мере, в конце концов это поможет.
Andy 11.03.2009 02:29:07

Я бы не назвал это лучшим способом, но вы могли бы реализовать ICustomTypeDescriptorи выставить свои поля как поддельные свойства с помощью GetPropertiesметода. Впрочем, если бы у вас было несколько десятков полей, было бы меньше кода.


Первоначально опубликовано Робертом Макни, но позже удалено. Восстановлен здесь, потому что это меня интересует ...

1
11.03.2009 02:03:24