2013-04-24 3 views
7

Я новичок в WPF И у меня есть вопрос. У меня есть модуль организации:WPF ComboBox привязка к ObservableCollection

class Organization : ObservableObject 
{ 
    public string OrganizationName { get; set; } 
} 

я имею ViewModel Организации:

class OrganizationViewModel : ObservableObject 
{ 
    int _count = 0; 

    public OrganizationViewModel() 
    { 
     Organization = new Organization {OrganizationName = "New Organization"}; 
    } 

    public Organization Organization { get; set; } 

    public string OrganizationName 
    { 
     get { return Organization.OrganizationName; } 
     set 
     { 
      if(Organization.OrganizationName != value) 
      { 
       Organization.OrganizationName = value; 
       RaisePropertyChanged("OrganizationName"); 
      } 
     } 
    } 

И у меня ViewModel всех организаций:

class AllOrganizationsViewModel 
    { 
     private ObservableCollection<OrganizationViewModel> m_organizations = new ObservableCollection<OrganizationViewModel>(); 


    public ObservableCollection<OrganizationViewModel> Organizations 
    { 
     get { return m_organizations; } 
     set { m_organizations = value; } 
    } 

    public AllOrganizationsViewModel() 
    { 
     for(int i = 0; i < 3; ++i) 
     { 
      m_organizations.Add(new OrganizationViewModel()); 
     } 
    } 

    void AddOrganizationNameExecute() 
    { 
     m_organizations.Add(new OrganizationViewModel()); 
    } 

    bool CanAddOrganizationNameExecute() 
    { 
     return true; 
    } 

    public ICommand AddOrganization{get{return new RelayCommand(AddOrganizationNameExecute, CanAddOrganizationNameExecute);}} 

} 

И это MainWindow.xaml:

<Window x:Class="DataIntegrityChecker.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:DataIntegrityChecker.ViewModels" Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:AllOrganizationsViewModel /> 
    </Window.DataContext> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="285*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="156" /> 
      <ColumnDefinition Width="347*" /> 
     </Grid.ColumnDefinitions> 
     <Label Content="Organization: " Margin="0,0,44,0" /> 
     <Button Grid.Row="1" Name="UpdateOrganizations" Content="Update Organization Name" Command="{Binding AddOrganization}" Margin="0,0,0,262" HorizontalAlignment="Left" Width="156" /> 
     <ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}" /> 
    </Grid> 
</Window> 

Теперь, что я получаю в элементах ComboBox, это имя класса OrganizationViewModel, но мне нужна строка OrganizationName. Мне кажется, что у меня есть привязка к OrganizationName, которая отсутствует, но я не могу понять, где добавить if (если это проблема). Я предполагаю, что могу создать коллекцию строк с именами организаций, которые мне нужны. Но в будущем мне понадобится больше свойств в классе организации, так что мне нужно, чтобы он работал.

Я буду признателен за любую помощь

ответ

13

Вам нужно добавить DisplayMemberPath:

<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}" 
      DisplayMemberPath="OrganizationName"/> 
+0

Отлично! спасибо, что это работает, я думаю, что я на самом деле попробовал, поэтому я, вероятно, ошибся. – MentalBrake

+0

Отладка практически невозможна. Когда в списке ничего не отображается, как кто-то должен знать, что такой атрибут отсутствует? Для меня это все равно не работало. У меня есть ItemSource, связанный с ObservableCollection в моем DataContext. 'ItemsSource =" {Binding Projects, Mode = OneWay} "', где 'Projects' - это имя свойства ObservableCollection на экземпляре объекта контекста данных. – Triynko

+1

Убедитесь, что вы используете правильный 'DisplayMemberPath', это должно быть свойство с открытым доступом. Кроме того, если у вас есть ошибки привязки, вы можете увидеть их в VS, используя «окно вывода» во время отладки. –

6

Другой способ может быть по определению ItemTemplate. Это дает большую гибкость при отображении

<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}" > 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding OrganizationName}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
+0

Спасибо, что выглядит полезным – MentalBrake

Смежные вопросы