2016-04-27 8 views
0

Я пытаюсь использовать ItemContainerStyleSelector для отображения различных стилей строк в сетке, в зависимости от типа объекта, определяющего строку (ItemsSource представляет собой совокупность IGridItem с, есть GridItem и GridSeparator, которые должны иметь разные стили). моя проблема заключалась в том, что SelectStyle моего StyleSelector никогда не назывался. Теперь я узнал (here) проблема может быть унаследованным стилем (библиотека Metro MahApps переопределяет стили по умолчанию всех стандартных элементов управления), которые, вероятно, уже устанавливают ItemContainerStyle.WPF DataGrid StyleSelector для строк

Итак, теперь мой вопрос: есть ли способ использовать мой StyleSelector, чтобы унаследованный стиль был базой для выбранных стилей? А если нет, как мне достичь другого стиля только для некоторых строк на основе их типа объекта?

EDIT:
Ручная настройка на ItemContainerStyle в null не имеют эффекта, SelectStyle моего StyleSelector никогда еще не называли.

EDIT2:
Поскольку я не получаю System.Windows.Data Error: 24 : Both 'ItemContainerStyle' and 'ItemContainerStyleSelector' are set; 'ItemContainerStyleSelector' will be ignored. как спросил Grx70, я полагаю, что ItemContainerStyle не проблема, как я сначала думал.

jstreet отметил, что это связано с MahApps.Metro, хотя ... (см свой комментарий)


Моя текущая реализация:

<DataGrid ItemsSource="{Binding Items}" ItemContainerStyleSelector="{StaticResource StyleSelector}"> 

Syle селектор:

public class GridRowStyleSelector : StyleSelector 
{ 
    private readonly ResourceDictionary _dictionary; 

    public GridRowStyleSelector() 
    { 
     _dictionary = new ResourceDictionary 
     { 
      Source = new Uri(@"pack://application:,,,/myApp;component/View/GridResources.xaml") 
     }; 
    } 

    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     string name = item?.GetType().Name; 
     if (name != null && _dictionary.Contains(name)) 
     { 
      return (Style)_dictionary[name]; 
     } 
     return null; 
    } 
} 

GridResources.xaml с тестовыми значениями:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="GridItem" TargetType="DataGridRow"> 
     <Setter Property="BorderThickness" Value="3"/> 
    </Style> 
    <Style x:Key="GridSeparator" TargetType="DataGridRow"> 
     <Setter Property="BorderBrush" Value="Red"/> 
    </Style> 
</ResourceDictionary> 
+0

Как раз для того чтобы получить его от таблицы - вы уверены, '' {StaticResource StyleSelector} 'разрешает экземпляр' GridRowStyleSelector'? – Grx70

+0

Подпись метода для стиля Select: public override Style SelectStyle (объект объекта, контейнер DependencyObject) – Manolo

+0

Кроме того, вы получаете сообщение об ошибке System.Windows.Data: 24: установлены оба параметра ItemContainerStyle и ItemContainerStyleSelector; «ItemContainerStyleSelector» будет проигнорирован. Ошибка в окне вывода? – Grx70

ответ

3

Я думаю, что нашел преступника. Оказывается, что правильный способ обработки стилей строк в DataGrid составляет RowStyle и RowStyleSelector, а не ItemContainerStyle и ItemContainerStyleSelector. Они работают, но только до тех пор, пока вы явно не используете RowStyle или RowStyleSelector. Это то, что делает MahApps Metro - он устанавливает значение RowStyle (я верю, переопределяя DataGrid стиль по умолчанию). Тогда я думаю, что ItemContainerStyle установлен внутри на DataGrid (некоторые испытания показали, что ItemContainerStyle был установлен, несмотря на то, что он явно устанавливает его на null).

Так, чтобы подвести итог, то это должно сделать трюк для вас:

<DataGrid ItemsSource="{Binding Items}" 
      RowStyle="{x:Null}" 
      RowStyleSelector="{StaticResource StyleSelector}"> 
    (...) 
</DataGrid> 

Кроме того, чтобы изменить MahApps стиль строки, а не отменить его полностью, вы должны основывать свои стили на MahApps одном:

<Style x:Key="GridItem" TargetType="DataGridRow" 
     BasedOn="{StaticResource MetroDataGridRow}"> 
    <Setter Property="BorderThickness" Value="3"/> 
</Style> 
<Style x:Key="GridSeparator" TargetType="DataGridRow" 
     BasedOn="{StaticResource MetroDataGridRow}"> 
    <Setter Property="BorderBrush" Value="Red"/> 
</Style> 
1

Вы можете изменить настройки по умолчанию ItemContainerStyle явно установив его null:

<DataGrid ItemsSource="{Binding Items}" 
      ItemContainerStyle="{x:Null}" 
      ItemContainerStyleSelector="{StaticResource StyleSelector}"> 
+0

ok, я пробовал это, но я все еще никогда не останавливаюсь в 'SelectStyle' ... Кажется, что у моего стиля есть другой причина просто игнорироваться:/ –

0

Конструктор класса GridRowStyleSelector является статическим и частным. Попробуйте удалить «статические» ключевые слова из этого класса и сделать конструктор общедоступным.

+0

Я все еще не вхожу в 'SelectStyle' ... старый конструктор работает так же, как и нестатический, если я устанавливаю точку останова, он останавливается там –

Смежные вопросы