2016-07-05 8 views
0

Я довольно новичок в 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, вероятно, можно было бы упростить, но я просто хочу, чтобы этот вопрос был первым, прежде чем начинать рефакторинг.

Заранее спасибо.

ответ

1

Проблема в том, что вы переопределяете стиль, который обычно применяется к DataGrid с вашим собственным пользовательским стилем.

Ваш собственный стиль может наследовать сеттеры из других стилей с помощью атрибута BasedOn.

Например:

<Style BasedOn="{StaticResource AzureDataGrid}"> 

Или наследовать от стиля по умолчанию для данного типа управления:

<Style BasedOn="{StaticResource {x:Type DataGrid}}"> 
+0

Спасибо за это Глен. Мне также пришлось добавить TargetType, поэтому окончательная строка тега Style выглядит так: