Пытаюсь привязать List<MyClass>
к ComboBox
. Ниже приведен простой код, который я реализовал:
C#
cmbList.ItemsSource = DbMain.GetNameList();
XAML
<StackPanel Grid.Row = "0" Orientation = "Horizontal" >
<TextBlock Text = "Names:" Margin = "5,0,5,0" VerticalAlignment = "Center" Width = "50" Visibility = "Collapsed"/>
<ComboBox x:Name = "cmbList" Width = "200" SelectionChanged = "cmbList_SelectionChanged"
DisplayMemberPath = "DisplayName" SelectedValuePath = "DisplayName" Foreground = "Black"/>
</StackPanel>
Проблема
Значения List<MyClass>
извлекаются из DbMain.GetNameList()
и связываются с ComboBox
, но они не видны. Когда я выполняю SelectionChanged
, я также могу получить доступ к SelectedItem
. Единственная проблема в том, что предметы не видны.
Ошибка в окне вывода
System.Windows.Data Error: 40 : BindingExpression path error: 'DisplayName' property not found on 'object' ''MyClass' (HashCode=804189)'. BindingExpression:Path=DisplayName; DataItem='MyClass' (HashCode=804189); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Предоставляете ли вы правильный путь DisplayMemberPath? проверьте орфографическую ошибку
@kennyzx Да. Там ошибка. System.Windows.Data Error: 40 : BindingExpression path error: 'DisplayName' property not found on 'object' ''MyClass' (HashCode=804189)'. BindingExpression:Path=DisplayName; DataItem='MyClass' (HashCode=804189); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Тогда это классическая ошибка привязки, вы должны определить свойство DisplayName
в MyClass
.
Я это уже определил. Я использую этот класс во многих других местах, и он отлично работает. Определение класса public class MyClass { public int Id; public string DisplayName; }
Это из-за отсутствия get set
?
Да, сделайте это свойством с getter
и / или setter
вместо поля.
Используя это выражение привязки, вы заявляете, что существует имущество с именем DisplayName
в MyClass
, но во время выполнения, поскольку такого имущество нет - вы определяете DisplayName
как поле, поэтому в вашем случае он не работает - поэтому ComboBox
является показаны пустые элементы.
<ComboBox x:Name = "cmbList"
DisplayMemberPath = "DisplayName"
В отличие от необработанных исключений, такого рода ошибки привязки не приводят к сбою приложения, но вы можете найти их след в окне вывода во время отладки.
Проверьте окно вывода, есть ли ошибка привязки, например «не удается найти свойство DisplayName»?