2011-10-27 36 views
6

Các vấn đề rất đơn giản: khi ItemsSource được cập nhật Combobox không "làm mới", ví dụ: các mục mới không xuất hiện để được thêm vào danh sách các mục trong hộp tổ hợp.Làm thế nào tôi có thể làm mới một combobox sau khi sửa đổi ItemsSource ObservableCollection

Tôi đã thử giải pháp từ câu trả lời được thu thập cho câu hỏi này: WPF - Auto refresh combobox content không có may mắn.

đây là mã của tôi, XAML:

<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" /> 

ViewModel:

public ObservableCollection<XmlNode> LeadTypeCollection { get; set; } 

cách tôi cập nhật bộ sưu tập này là trong phương pháp riêng biệt, mà tải dữ liệu từ file XML Cập nhật: this.LeadTypeCollection = GetLeadTypesDataSource();

Tôi cũng đã thử sử dụng Add cho mục đích thử nghiệm:

this.LeadTypeCollection = GetLeadTypesDataSource(); 
ItemToAdd = LeadTypeCollection[LeadTypeCollection.Count - 1]; 
this.LeadTypeCollection.Add(ItemToAdd); 

bộ sưu tập cập nhật mã chắc chắn sẽ khởi động, tôi có thể xem các mục mới trong bộ sưu tập này khi gỡ lỗi, nhưng tôi không thấy chúng trong hộp tổ hợp.

Thực hiện việc này trong các tác vụ mã xaml phía sau: LeadTypeComboBox.ItemsSource = MyViewModel.GetLeadTypesDataSource(); nhưng tôi muốn đạt được điều này với MVVM, tức là mã phải nằm trong ViewModel không nhận biết được điều khiển LeadTypeComboBox.

Trả lời

4

Tôi nghĩ rằng tôi đã thấy điều này trước và giải pháp là cập nhật thuộc tính thu thập để tăng thay đổi.

tức

public class MyViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<XmlNode> leadTypeCollection; 

    public string LeadTypeCollection 
    { 
     get { return leadTypeCollection; } 
     set 
     { 
      if (value != leadTypeCollection) 
      { 
       leadTypeCollection = value; 
       NotifyPropertyChanged("LeadTypeCollection"); 
      } 
     } 

    public MyViewModel() 
    { 
     leadTypeCollection = new ObservableCollection<XmlNode>(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     PropertyChanged.Raise(this, info); 
    } 
} 

Tôi có một phương pháp khuyến nông để nâng cao tài sản (như được tìm thấy ở những nơi khác trên stackoverflow):

public static void Raise(this PropertyChangedEventHandler handler, object sender, string propertyName) 
{ 
    if (null != handler) 
    { 
     handler(sender, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

ah, ok, ViewModel nên kế thừa 'giao diện INotifyPropertyChanged' và giải pháp của bạn hoạt động với thực hiện' PropertyChangedEventHandler' – Tsar

+0

Có đúng vậy. Tôi sẽ dọn dẹp các mã một chút mặc dù :-) – Firedragon

6

Firedragons câu trả lời sẽ làm việc, nhưng tôi muốn để khởi tạo LeadTypeCollection chỉ một lần và sử dụng rõ ràng, thêm xóa để cập nhật bộ sưu tập của bạn.

var update = GetLeadTypesDataSource();  
this.LeadTypeCollection.Clear(); 

foreach(var item in update) 
{ 
    this.LeadTypeCollection.Add(item); 
} 

XAML của bạn bắt buộc phải làm việc nếu các DataContext là đúng

<ComboBox Name="LeadTypeComboBox" ItemsSource="{Binding LeadTypeCollection}" /> 
+0

Đó là cách tôi có xu hướng làm điều đó quá. Các ObservableCollections được xây dựng trong việc nâng cao đặc tính hoạt động tốt. Tình hình tôi đã cho thấy là nơi bạn thay đổi toàn bộ danh sách mà tôi đoán không làm tăng sự thay đổi – Firedragon

+1

np giải pháp của bạn hoạt động tốt :) nhưng tôi thích cách tiếp cận của tôi nhiều hơn. và như xa như bạn làm việc với ICollectionView để sắp xếp và lọc - nó dễ dàng hơn để làm theo cách của tôi. – blindmeis

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