2010-01-28 35 views
16

Tôi có một ComboBox trong một ứng dụng WPF được ràng buộc với một ObservableCollection của các đối tượng Cục trong một lớp C# ViewModel. Tôi muốn sử dụng hộp kết hợp để lọc một bộ sưu tập khác theo bộ phận (Và thực sự nó hoạt động cho điều đó ngay bây giờ) Vấn đề là tôi muốn thêm một tùy chọn bổ sung "Tất cả" vào đầu danh sách. Có cách nào đúng để làm điều này không. Làm cho một bộ phận giả cảm thấy sai trái theo nhiều cách.Làm thế nào để bạn thêm một mục chung vào một ComboBox ràng buộc vào một bộ sưu tập trong WPF

Các ComboBox

<ComboBox ItemsSource="{Binding Path=Departments}" 
      SelectedValue="{Binding Path=DepartmentToShow , Mode=TwoWay}" /> 

Trả lời

22

Bạn có thể sử dụng một CompositeCollection như ItemsSource cho ComboBox để bao gồm các "Tất cả" tùy chọn. Bạn cần đặt thuộc tính Bộ sưu tập của CollectionContainer thành đối tượng "ObservableCollection of Department" của bạn.

<ComboBox > 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <ComboBoxItem>All</ComboBoxItem> 
      <CollectionContainer x:Name="departmentCollection"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

Không chắc nếu điều này sẽ phù hợp với tình hình lọc của bạn tuy nhiên ...

+1

+1 Wow là một lập trình viên WPF có kinh nghiệm Tôi thậm chí còn không biết về 'CompositeCollection'! Có tất cả các loại giải pháp cho việc này khi tìm kiếm trên internet, nhưng không có đề cập đến điều này! Incredible ... –

+0

Yeah khi tôi đọc này tôi đã ngạc nhiên. Tôi đã làm một số nhìn vào nó sáng nay và tôi nghĩ rằng nó sẽ làm các trick. Ngay bây giờ việc lọc được thực hiện trong việc xây dựng truy vấn LINQ vì vậy tôi nghĩ rằng tôi có thể thử nghiệm cho 'Tất cả' và nếu điều đó không được chọn lặp lại peopleCollection. Trong tương lai, tôi đã lên kế hoạch tái cấu trúc và sử dụng một CollectionViewSource để lọc chế độ xem mà không cần phải requerying; Tôi không chắc làm thế nào mà sẽ làm việc nhưng đối với câu hỏi này tôi có câu trả lời của tôi. Cảm ơn bạn! –

+1

@Aviad có nó là một giải pháp tốt đẹp, một điều mà hút một chút là bạn không thể liên kết với các tài sản Bộ sưu tập thông qua DataContext như CompositeCollection không phải là Freezable. Điều này có thể được làm việc xung quanh bằng cách liên kết với một tài nguyên tĩnh ... –

0

Giả sử bạn có một ComboBox tên MyCombo, một thực thể có tên MyEntity liên kết với một DomaineService tên MyDomainService.

Đừng quên

using System.ServiceModel.DomainServices.Client; 

và tất nhiên bằng cách sử dụng hoạt động tốt với trang web của bạn trong tổ chức của bạn và DomainService

Bạn gọi một Proc tên:

void LoadEntities() 
{ 
    MyDomainService_Context = new MyDomainService(); 
    EntityQuery<MyEntity > mQuery = null; 

    mQuery = from q in _Context.GetMyDomainServiceQuery() 
      select q; 

    LoadOperation<MyEntity > loadOpLoadEntities = _Context.Load(mQuery, LoadOpLoadEntitiesCallBack, null); 
} 

Sau đó, trong CallBack chức năng:

void LoadOpLoadEntitiesCallBack(LoadOperation<MyEntity> loadOperation) 
{ 
    if (loadOperation.Entities.Count() > 0) 
    { 
     List<MyEntity> mList = new List<MyEntity>(); 
     MyEntity mE = new MyEntity(); 
     mE.Column1 = -1; 
     mE.Column2 = "Default value"; 
     mList.Add(mE); 

     for (int i = 0; i < loadOperation.Entities.Count(); i++) 
     { 
      mList.Add(loadOperation.Entities.ToList()[i]); 
     } 

     this.MyCombo.ItemsSource = mList.ToList(); 
    } 
} 
+0

Đây là một ứng dụng MVVM WPF sử dụng LINQ to SQL. Giải pháp Composite Collection đã hoạt động khá tốt trong một vài năm nhưng cảm ơn cho đầu vào bổ sung. –

Các vấn đề liên quan