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