Я довольно новичок в WPF, поэтому заранее извиняюсь, если ответ на этот вопрос очень прост. Я оглядывался повсюду, но не нашел подходящего решения.Невозможно использовать DataGrid стиля MahApps в UserControl
The low-down: У меня есть приложение, использующее MahApps. Windows в моем приложении работает нормально. Я могу установить стиль и изменить темы, и он применяется во всех окнах. Проблема в том, что в моем MainWindow у меня есть несколько UserControls. Один из этих UserControls имеет DataGrid, и по какой-то причине DataGrid не будет использовать стиль MahApps DataGrid по умолчанию.
Еще одна вещь: My DataGrid использует DataTriggers для отображения различных наблюдаемых списков в зависимости от нажатого RadioButton. Поэтому он не позволяет мне установить стиль DataGrid (согласно руководству MahApps здесь: http://mahapps.com/controls/datagrid.html).
MahApps предложение:
<DataGrid ItemsSource="{Binding People}" Margin="10,20,10,0"
AutoGenerateColumns="True"
Style="{StaticResource AzureDataGrid}">
Другое предложение, которое я нашел в том, чтобы добавить MahApps ресурсов в словарь ресурсов моего UserControl. Это не сработало, поэтому я удалил этот код.
Мой текущий UserControl XAML:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TrayportLibrary.Home"
xmlns:helpers="clr-namespace:TrayportLibrary.Helpers"
xmlns:controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
x:Class="TrayportLibrary.Search.SearchView"
mc:Ignorable="d" >
<UserControl.Resources>
<helpers:StringToVisibilityConverter x:Key="StringToVisibilityConverter"/>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</UserControl.Resources>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="LoadCollections"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<StackPanel FocusManager.FocusedElement="{Binding ElementName=SearchBox}">
<Grid Name="MainGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox x:Name="SearchBox"
Focusable="True"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Text="{Binding SearchInput, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Height="25"
BorderBrush="Black"
BorderThickness="2"
Grid.Column="0"
Grid.Row="0"
Margin="0,0,5,0"/>
<StackPanel Grid.Column="1"
Grid.Row="0"
Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Left">
<RadioButton GroupName="SearchSelection"
Name="BookRadio"
Content="Books"
Margin="0,0,5,0"
IsChecked="{Binding SearchBook}"
Command="{Binding SetSearchCommand}"
CommandParameter="book"
Click="RadioButton_OnClick"/>
<RadioButton GroupName="SearchSelection"
Name="MemberRadio"
Content="Members"
IsChecked="{Binding SearchMember}"
Command="{Binding SetSearchCommand}"
CommandParameter="member"
Click="RadioButton_OnClick"/>
</StackPanel>
<FrameworkElement Grid.Row="1" Grid.Column="0" x:Name="Proxy"/>
<DataGrid Name="DataGrid"
Grid.Row="1"
Grid.ColumnSpan="2"
Grid.Column="0"
IsReadOnly="True"
AutoGenerateColumns="False"
Height="200"
VerticalScrollBarVisibility="Auto"
Visibility="{Binding Path=Text,
ElementName=SearchBox,
Converter={StaticResource
StringToVisibilityConverter}}">
<DataGrid.Columns>
<DataGridTextColumn Header="Book ID" Binding="{Binding BookID}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Title" Binding="{Binding Title}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Author(s)" Binding="{Binding AuthorData}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Date Due" Binding="{Binding DateDue, StringFormat=dd/MM/yyyy}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridCheckBoxColumn Header="Out" Binding="{Binding IsOut}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="On Loan to" Binding="{Binding OnLoanToUserName}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridCheckBoxColumn Header="Lost" Binding="{Binding IsLost}" Visibility="{Binding DataContext.BookVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Visibility="{Binding DataContext.MemberVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Username" Binding="{Binding UserName}" Visibility="{Binding DataContext.MemberVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Books on Loan" Binding="{Binding BooksOnLoan}" Visibility="{Binding DataContext.MemberVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
<DataGridTextColumn Header="Books Overdue" Binding="{Binding BooksOverdue}" Visibility="{Binding DataContext.MemberVisibility, Converter={StaticResource BooleanToVisibilityConverter}, Source={x:Reference Proxy}, Mode=TwoWay, NotifyOnSourceUpdated=True}"/>
</DataGrid.Columns>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<ei:CallMethodAction MethodName="OnSelectedItem" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=MemberRadio, Path=IsChecked}" Value="true">
<Setter Property="DataGrid.ItemsSource" Value="{Binding Members}"/>
<Setter Property="DataGrid.SelectedItem" Value="{Binding SelectedMember}"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=BookRadio, Path=IsChecked}" Value="true">
<Setter Property="DataGrid.ItemsSource" Value="{Binding Books}"/>
<Setter Property="DataGrid.SelectedItem" Value="{Binding SelectedBook}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
</DataGrid>
</Grid>
</StackPanel>
Любой/код/лучшие практики советы будут оценены. Я также знаю, что мой текущий xaml, вероятно, можно было бы упростить, но я просто хочу, чтобы этот вопрос был первым, прежде чем начинать рефакторинг.
Заранее спасибо.
Спасибо за это Глен. Мне также пришлось добавить TargetType, поэтому окончательная строка тега Style выглядит так: