2013-04-24 46 views
7

Tôi mới tham gia WPF Và tôi có một câu hỏi. Tôi có module tổ chức:ComboBox WPF Binding to ObservableCollection

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

Tôi có ViewModel của Tổ chức:

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"); 
      } 
     } 
    } 

Và tôi có ViewModel của tất cả các tổ chức:

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);}} 

} 

Và đây là 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> 

Bây giờ, những gì tôi nhận được trong các mục ComboBox là tên của lớp OrganizationViewModel nhưng những gì tôi cần là chuỗi OrganizationName. Dường như với tôi rằng tôi có một số ràng buộc để OrganizationName đó là mất tích nhưng tôi không thể tìm ra nơi để thêm nếu (nếu đó là vấn đề). Tôi cho rằng tôi có thể làm một bộ sưu tập các dây với tên của các tổ chức mà tôi cần. Nhưng trong tương lai tôi sẽ cần nhiều tài sản hơn trong lớp tổ chức vì vậy đó là cách tôi cần nó để làm việc.

tôi sẽ đánh giá cao sự giúp đỡ nào

Trả lời

13

Bạn cần phải thêm DisplayMemberPath:

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

Tuyệt vời! cảm ơn nó hoạt động, tôi nghĩ rằng tôi thực sự đã thử nó vì vậy tôi có thể đã nhận nó sai. – MentalBrake

+0

Điều này gần như không thể gỡ lỗi. Khi không có gì xuất hiện trong danh sách, làm thế nào có ai biết rằng một thuộc tính như vậy bị thiếu? Dù sao nó cũng không làm việc cho tôi. Tôi có ItemSource ràng buộc với một ObservableCollection trên DataContext của tôi. 'ItemsSource =" {Binding Projects, Mode = OneWay} "', trong đó 'Projects' là tên thuộc tính của ObservableCollection trên cá thể đối tượng ngữ cảnh dữ liệu của tôi. – Triynko

+1

Đảm bảo rằng bạn đang sử dụng đúng 'DisplayMemberPath', nó phải là thuộc tính có accessor công cộng. Ngoài ra, nếu bạn có lỗi liên kết, bạn có thể thấy chúng trong VS bằng cách sử dụng 'Cửa sổ đầu ra' trong khi gỡ lỗi. –

6

Một cách khác có thể bằng cách định nghĩa ItemTemplate. Tính năng linh hoạt hơn khi hiển thị

<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

Cảm ơn, điều đó có vẻ hữu ích – MentalBrake