0

我試圖解決使用LINQ,這我剛學一個簡單的問題UI控件。無法從採集得到變更通知綁定到LINQ查詢

我有一個字符串的集合,在這種情況下代表串行端口,將顯示在控制,但必須有序。原始集合是未排序的,我不一定要修改它,或者製作它的副本。所以,我創建了一個IEnumerable類型的屬性並將其綁定到一個ComboBox。

這個偉大的工程,組合框具有正確的順序正確的內容。但是,如果原始集合發生更改,則a)當原始集合發生更改時,ComboBox無法正確通知,或者b)LINQ查詢未刷新。

嘗試一些不同的東西,我看不出下面的代碼無法正常工作。我肯定錯過了什麼。

有可能會在這裏額外的代碼是多餘的......總之,源其次是XAML的控件:

public partial class MainWindow : Window 
{ 
    ObservableCollection<string> original = new ObservableCollection<string>(); 
    public ObservableCollection<string> OriginalList { 
     get { return (original); } 
    } 

    private IEnumerable<string> _portList; 
    public IEnumerable<string> PortList { 
     get { return (_portList); } 
    } 

    public MainWindow() { 
     InitializeComponent(); 

     original.Add("COM5"); 
     original.Add("COM1"); 
     original.Add("COM3"); 
     original.Add("COM4"); 
     original.Add("COM2"); 

     original.CollectionChanged += new NotifyCollectionChangedEventHandler(OriginalChanged); 

     _portList = (
      from port in original 
      orderby port ascending 
      select port 
     ); 

     DataContext = this; 
    } 

    private void AddPortButton_Click(object sender, RoutedEventArgs e) { 
     original.Add("COM2.5"); 
    } 

    void OriginalChanged(Object sender, NotifyCollectionChangedEventArgs args) { 
     NotifyPropertyChanged("PortList"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String info) { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

的XAML:

<ComboBox Name="SerialPortListBox" ItemsSource="{Binding PortList}" Width="100" /> 
    <ComboBox Grid.Row="1" Name="OriginalListBox" ItemsSource="{Binding OriginalList}" Width="100" Margin="0,5,0,0"/> 
    <Button Grid.Column="1" Name="AddPortButton" Content="Add Port 2.5" Width="100" Margin="10,0,0,0" Click="AddPortButton_Click" /> 

回答

1

我想你只會通過將您的ComboBox綁定到ObservableCollection獲取您想要的更改通知。此類實現了接口INotifyCollectionChanged,這是WPF的內部依靠通知UI需要更新的內容。

我看到你試圖通過爲PortList實現INotifyPropertyChanged來解決這個問題,但是這不會以你想要的方式工作。該界面不觸發適當的事件觸發組合框刷新。 INotifyCollectionChanged告訴一個集合有變化監聽器(即,「添加」,「刪除」,「移動」,「替換」,「復位」),而僅INotifyPropertyChanged的表明,一些價值在綁定的對象發生了變化。 ComboBox不會響應INotifyPropertyChanged事件,事實上它甚至可能不訂閱該類型的事件。

所以,無論是直接結合到底層數據源,或實現在其頂部一個第二的ObservableCollection,而不是僅一個IEnumerable,其不改變上通知。