2012-05-10 1 views
0

Как получить базовое связывание для работы между ComboBox и ObservableCollection? Я не могу получить ничего, кроме сообщений об ошибках.Как связать ObservableCollection с ComboBox?

VB:

Class MainWindow 
    Dim Units As New ObservableCollection(Of String) 

    Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 
     Units.Clear() 
     Units.Add("in") 
     Units.Add("mm") 
     Units.Add("cm") 
    End Sub 
End Class 

XAML:

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox Height="59" HorizontalAlignment="Left" Margin="136,96,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="319" 
       ItemsSource="{Binding Units}"/> 
</Grid> 

Независимо от того, что я делаю, то ComboBox всегда кажется пустым и есть сообщение об ошибке в консоли:

System.Windows.Data Error: 40 : BindingExpression path error: 'Units' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=Units; DataItem='MainWindow' (Name=''); target element is 'ComboBox' (Name='ComboBox1'); target property is 'ItemsSource' (type 'IEnumerable')

ответ

2

В XAML, изменить только {Binding}, или, что эквивалентно, {Binding Path =.}:

<ComboBox Height="59" HorizontalAlignment="Left" Margin="136,96,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="319" ItemsSource="{Binding}"/> 

Установите контекст данных явно на объект, из кода позади, в * Window_Loaded * обработчик события:

ComboBox1.DataContext = Units; 
+0

Я сделал именно то, что вы предложили, и я все еще получаю то же сообщение об ошибке, и ComboBox по-прежнему пуст. Argh. – evilspoons

+0

@evilspoons Моя ошибка. См. Обновление. – McGarnagle

+0

Ура, это работает! Спасибо! ... теперь, если только я понял разницу между этим и десятками вариаций, которые я пробовал, хе-хе. – evilspoons