2012-08-02 86 views
1

我有和this一樣的問題。但我使用DataGrid而不是ListBox,它似乎不像這樣工作(這也可能是因爲我從來沒有使用Visual Basic,也沒有將代碼正確地轉換爲C#)。 我基本上想要兩個DataGrids在不同的過濾器相同的數據。Datagrid可觀察集合的多視圖

ICollectionView view_dataLinesUnfiltered; 
    ICollectionView view_dataLinesFiltered; 

public MainWindow() 
    { 
     ... 
     //view_dataLines = CollectionViewSource.GetDefaultView(dataLines); // <- Filter works on both 
     view_dataLinesUnfiltered = new CollectionView(dataLines); // <- Filter doesn´t work at all 
     view_dataLinesFiltered = new CollectionView(dataLines); 
     .... 
     // Control Events 
     this.ShowAA.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ToggleButton.UncheckedEvent)); 

    } 

    private void ShowAA_Checked(object sender, RoutedEventArgs e) 
    { 
     view_dataLinesUnfiltered.Filter = null; 
    } 

    private void ShowAA_UnChecked(object sender, RoutedEventArgs e) 
    { 
     view_dataLinesUnfiltered.Filter = delegate(object o) { return FilterContent(o as ErrorDetection.stDataLine, "AA", ""); }; 
    } 

    bool FilterContent(ErrorDetection.stDataLine line, string sFilterAA, string sFilter) 
    { 
     shortArrayToHexStringConverter converter = new shortArrayToHexStringConverter(); 

     string comBuffer = converter.Convert(line.ComBufferP as object,typeof(string),0,System.Globalization.CultureInfo.CurrentCulture) as string; 

     return false;// !comBuffer.Contains("AA"); 
    } 

FilterContent方法被調用時沒有問題,但DataGrid總是顯示行。如果我使用GetDefaultView,則Filter將在兩個Datagrids上工作。我是否必須使用其他視圖而不是CollectionView(ListCollectionView也不起作用)?

我做了一個小樣本項目,以顯示問題sample。它只包含一個構造函數和一個可觀察的集合。

+0

你是如何綁定或設置你的DataGrid上的ItemsSource? – 2012-08-02 22:58:12

+0

即時設置this.DataContext = dataLines;在MainWindow構造函數中。然後ItemsSource =「{Binding}」在Xaml中的DataGrids – user1550097 2012-08-02 23:55:27

回答

0

您需要指定在哪個DataGrid上使用哪個ICollectionVIew。

如果您只是綁定到集合(在這種情況下爲dataLines),WPF將使用「默認視圖」(或者如果需要創建一個),這就是爲什麼第一條註釋掉的行適用於過濾。

有,你可以指定哪些視圖用於該數據網格的幾種方法,取決於什麼圖案等您使用

1)像鏈接的問題,你可以設置的ItemsSource爲每個數據網格中窗口的後臺代碼,初始化的意見後,如:

filteredDataGrid.ItemsSource = view_dataLinesFiltered; 
unfilteredDataGrid.ItemsSource = view_dataLinesUnfiltered; 

2)你可以在窗口的DataContext設置爲自己,或作出對包含該視圖的屏幕視圖模型,並進行意見公開屬性,然後綁定到每個網格的預期視圖,例如

<DataGrid ItemsSource="{Binding View_dataLinesFiltered}"> .... 

編輯:

現在我不是在工作和可以得到的保管箱,並與你的榜樣好像怪異行爲的原因是直接使用的CollectionView的發揮。在msdn page for CollectionView它說

你不應該在你的代碼中創建這個類的對象。要爲僅實現IEnumerable的集合創建 集合視圖,請創建CollectionViewSource對象,將集合添加到 Source屬性,然後從View屬性中獲取集合視圖。

但是,如果你不想成立於XAML的意見,你也可以改變你的CollectionViews到ListCollectionViews,它應該按預期工作(這很可能是CollectionViewSource正在爲你身後的視圖類型無論如何,場景)。

+0

謝謝,它現在部分工作,但如果我調整窗口的大小,應該過濾的行再次顯示。我是否需要處理一些事件並在那裏調用Filter事件?使用默認視圖調整大小的作品。 – user1550097 2012-08-03 02:19:40

+0

Filter semms僅適用於添加的行。如果窗口繪製新的已經存在的行不會被過濾 – user1550097 2012-08-03 02:33:15

0

我以某種方式工作。我現在使用CollectionViewSources而不是ICollectionView。

<Window.Resources> 
    <CollectionViewSource x:Key="viewSource_dataLinesUnfiltered"/> 
    <CollectionViewSource x:Key="viewSource_dataLinesFiltered"/> 
</Window.Resources> 
... 
<DataGrid Name="Filtered_Datagrid" ItemsSource="{Binding Source={StaticResource viewSource_dataLinesFiltered}}" > 
    ... 
</DataGrid> 
    ... 
<DataGrid Name="Unfiltered_Datagrid" ItemsSource="{Binding Source={StaticResource viewSource_dataLinesUnfiltered}}"> 
    ... 
</DataGrid> 

與C代碼:

CollectionViewSource viewSource_dataLinesUnfiltered; 
    CollectionViewSource viewSource_dataLinesFiltered; 
    ... 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = dataLines; 

     viewSource_dataLinesUnfiltered = (CollectionViewSource)this.Resources["viewSource_dataLinesUnfiltered"]; 
     viewSource_dataLinesUnfiltered.Source = dataLines; 
     viewSource_dataLinesFiltered = (CollectionViewSource)this.Resources["viewSource_dataLinesFiltered"]; 
     viewSource_dataLinesFiltered.Source = dataLines; 


     // Control Events 
     this.ShowAA.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ToggleButton.UncheckedEvent)); 

    } 

    private void ShowAA_Checked(object sender, RoutedEventArgs e) 
    { 
     viewSource_dataLinesUnfiltered.View.Filter = null; 
    } 

    private void ShowAA_UnChecked(object sender, RoutedEventArgs e) 
    { 
     viewSource_dataLinesUnfiltered.View.Filter = delegate(object o) { return FilterContent(o as ErrorDetection.stDataLine, "AA", ""); }; 
    } 

    bool FilterContent(ErrorDetection.stDataLine line, string sFilterAA, string sFilter) 
    { 
     shortArrayToHexStringConverter converter = new shortArrayToHexStringConverter(); 

     string comBuffer = converter.Convert(line.ComBufferP as object,typeof(string),0,System.Globalization.CultureInfo.CurrentCulture) as string; 

     return !comBuffer.Contains("AA"); 
    } 

但我不確定爲什麼是這樣工作的,並使用ICollectionView當過濾器不應用於窗口重新繪製。