2015-01-07 3 views
0

У меня есть проект WPF со списком, который я пытаюсь привязать к списку объектов ComboboxItem. ComboboxItem - это класс, который я создал для своего образца проекта. Это частично работает ... У меня есть три элемента, доступных для combobox, но отображаемое значение пустое, а значение combobox.SelectedValue равно null. Я видел несколько сообщений stackoverflow и других сообщений в блоге о том, как это сделать. И насколько я могу судить, я делаю это правильно. Но, очевидно, я делаю что-то неправильно. Вот исходный код для тестового проекта ...WPF - Bind combobox to Список пользовательских объектов класса

XAML:

<Window x:Class="WpfTestApp_ComboBoxes.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" 
     Loaded="Window_Loaded"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="40"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <ComboBox x:Name="cboMyCombo" Grid.Row="0" 
        SelectionChanged="cboMyCombo_SelectionChanged"></ComboBox> 
    </Grid> 
</Window> 

C# кода:

public partial class MainWindow : Window 
{ 
    List<ComboboxItem> _list = new List<ComboboxItem>(); 

    public MainWindow() 
    { 
     _list.Add(new ComboboxItem() { DisplayValue = "One", InternalValue = "1" }); 
     _list.Add(new ComboboxItem() { DisplayValue = "Two", InternalValue = "2" }); 
     _list.Add(new ComboboxItem() { DisplayValue = "Three", InternalValue = "3" }); 

     InitializeComponent(); 
    } 

    private void cboMyCombo_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (e.AddedItems.Count > 0) 
     { 
      ComboBox cb = sender as ComboBox; 
      MessageBox.Show(string.Format("Selected Item: {0}, Selected Value: {1}", cb.SelectedItem, cb.SelectedValue)); 
     } 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     cboMyCombo.ItemsSource = _list; 
     cboMyCombo.DisplayMemberPath = "DisplayValue"; 
     cboMyCombo.SelectedValuePath = "InternalValue"; 
    } 
} 

ComboBoxItem Класс:

public class ComboboxItem 
{ 
    public string DisplayValue; 
    public string InternalValue; 
} 
+1

Создание свойств DisplayValue и InternalValue вместо того, чтобы их как открытые члены – user469104

+1

Почему вы делаете ваши привязки данных в коде позади, когда вы можете сделать это гораздо чище [в вашем XAML] (HTTP: //msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx)? – BCdotWEB

+0

Это всего лишь тестовый проект. Я пробовал много итераций использования XAML и кода, пытаясь понять, что я делаю неправильно. Оказывается, это был класс ComboboxItem. :/ – DeadZone

ответ

0

изменение

public class ComboboxItem 
{ 
    public string DisplayValue; 
    public string InternalValue; 
} 

в

public class ComboboxItem 
{ 
    public string DisplayValue {get;set;} 
    public string InternalValue {get;set;} 
} 
+0

Ничего себе. Наверное, я был настолько сосредоточен на сборнике, что упустил очевидную проблему. * вздох * спасибо. (Это был случай «не мог видеть лес для деревьев».) Я помню, как читал, теперь, когда вам нужно иметь свойство «Свойство». Оглядываясь назад, это очевидно. – DeadZone