Aktualizacja listy w DataGrid po wyłączeniu filtrowania

0

Cześć,

Zabrałem się za swoją pierwszą aplikację WPF, z założeniem, że aplikacja będzie miała jakiś konkretny wygląd. Jest to prosta aplikacja do zmian nazw plików w podanym folderze. Jako bazę do zestawienia nazw zastosowałem DataGrid:

<DataGrid
    x:Name="filesList"
    Grid.Row="1">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn x:Name="isSelectedBox" Binding="{Binding Selected}" Width="25"/>
        <DataGridTextColumn
            Width="*"
            Binding="{Binding FileName}"
            ElementStyle="{StaticResource TextBlockStyle}"
            Header="File name"
            IsReadOnly="True"/>
        <DataGridTextColumn
            HeaderStyle="{StaticResource extensionFiltersHeader}"
            Width="70"
            Binding="{Binding Extension}"
            ElementStyle="{StaticResource TextBlockStyle}"
            Header="Extension"
            IsReadOnly="True" 
            />
        <DataGridTextColumn
            Width="*"
            Binding="{Binding NewName}"
            EditingElementStyle="{StaticResource CustomDataGridTextBox}"
            ElementStyle="{StaticResource TextBlockStyle}"
            Header="New name" />
    </DataGrid.Columns>
</DataGrid>

jednak teraz chciałbym rozszerzyć działanie aplikacji o możliwość filtrowania listy plików po ich rozszerzeniu, dlatego stworzyłem styl dla DataGridHeader, zmieniając go w ComboBox

<Style x:Key="extensionFiltersHeader" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Border Background="White">
                    <ComboBox
                        x:Name="extensionComboBox"
                        Margin="0"
                        Width="{TemplateBinding Width}"
                        ItemsSource="{Binding DataContext.Extensions, RelativeSource={RelativeSource AncestorType=DataGrid}}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox
                                        HorizontalAlignment="Center"
                                        VerticalAlignment="Center"
                                        IsChecked="{Binding IsActive}" />
                                    <TextBlock Width="100" Text="{Binding ExtensionOfFile}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                        <ComboBox.ItemContainerStyle>
                            <Style TargetType="ComboBoxItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                            </Style>
                        </ComboBox.ItemContainerStyle>
                    </ComboBox>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Note: Wszystkie style zawarłem w pliku App.xaml.

Aplikacja wczytuje listy plików, pozwala zmienić nazwy, ładuje prawidłowo listę rozszerzeń do ComboBoxa. Brakuje mi funkcji aktualizacji listy po rozwinięciu listy rozszerzeń i odklikaniu jednego z checkboxów przy danym rozszerzeniu. Gdybym zawarł style w oknie MainWindow to nie byłoby problemu, dodałbym do powyższego stylu event DropDownClosed i wywołał już przygotowaną metodę.
Jak powinienem do tego podejść jeśli wszystkie style są zawarte w App.xaml? Czy powinienem dodać po prostu DropDownClosed to kontrolki i obsłużyć to w code-behind App.xaml?
Może jest jakiś inny "bardziej prawidłowy" sposób, który umożliwi mi pominięcie dodawania kodu do App.xaml.cs?
Szukam wskazówki z serii jak powinno być, żeby było poprawnie. Jeżeli już w tym co jest powyżej są jakieś kardynalne błędy to proszę o wytknięcie.

Pozdrawiam

0

Dla otrzymania samego wyniku filtrowania może być pomocny CollectionViewSource. Co do "bo wydaje mi sie, ze może przy aktualizaji wartości dla danego filtra bede tez wstanie aktualizować widok listy..?"
Tak. W MVVM tak powinno to działać. W seterze właściwości (tam gdzie masz coś zbindowane i gdzie coś zmieniasz) ustawiasz co ma się dziać z tym czy innym obiektem. A Jeżeli tamten się zmieni to z pomocą onPropertyChanged umieszczonej również w seterze informujesz widok że ma wyświetlić aktualny stan tego zmienionego obiektu. Manipulacja na poziomie ViewModel w twoim przypadku. Spory temat na szybkiego posta :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1