我試圖解決使用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" />