.NET WPF XAML "Ошибка пути BindingExpression: ... свойство не найдено" - PullRequest
4 голосов
/ 10 марта 2009

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

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

Class W3CError

    Public Type As ErrorOrWarning
    Public Line As Integer
    Public Col As Integer
    Public Message As String
    Public MessageId As String
    Public Explanation As String
    Public Source As String

    Enum ErrorOrWarning
        ValidationError
        ValidationWarning
    End Enum

End Class

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

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: 'Line' свойство не найдено на «объекте» '' W3CError '(HashCode = ...)'. BindingExpression: Path = линия; DataItem = 'W3CError' (HashCode = ...); целевой элемент 'TextBlock' (Name = ''); целевое свойство is 'Text' (тип 'String')

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

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

Class W3CError

    Private _Type As ErrorOrWarning
    Private _Line As Integer
    Private _Col As Integer
    Private _Message As String
    Private _MessageId As String
    Private _Explanation As String
    Private _Source As String

    Enum ErrorOrWarning
        ValidationError
        ValidationWarning
    End Enum

    Public Property Type() As ErrorOrWarning
        Get
            Return _Type
        End Get
        Set(ByVal value As ErrorOrWarning)
            _Type = value
        End Set
    End Property

    Public Property Line() As Integer
        Get
            Return _Line
        End Get
        Set(ByVal value As Integer)
            _Line = value
        End Set
    End Property

    Public Property Col() As Integer
        Get
            Return _Col
        End Get
        Set(ByVal value As Integer)
            _Col = value
        End Set
    End Property

    Public Property Message() As String
        Get
            Return _Message
        End Get
        Set(ByVal value As String)
            _Message = value
        End Set
    End Property

    Public Property MessageId() As String
        Get
            Return _MessageId
        End Get
        Set(ByVal value As String)
            _MessageId = value
        End Set
    End Property

    Public Property Explanation() As String
        Get
            Return _Explanation
        End Get
        Set(ByVal value As String)
            _Explanation = value
        End Set
    End Property

    Public Property Source() As String
        Get
            Return _Source
        End Get
        Set(ByVal value As String)
            _Source = value
        End Set
    End Property

End Class

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

Ответы [ 2 ]

4 голосов
/ 10 марта 2009

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

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

1 голос
/ 11 марта 2009

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


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

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