Я пытаюсь использовать ItemContainerStyleSelector для отображения различных стилей строк в сетке данных в зависимости от типа объекта, определяющего строку (ItemsSource представляет собой набор IGridItem
, есть GridItem
и GridSeparator
, которые должны получить разные стили). моя проблема заключалась в том, что SelectStyle
моего StyleSelector никогда не вызывался. Теперь я обнаружил (здесь), что проблема может заключаться в унаследованном стиле (библиотека MahApps Metro переопределяет стили по умолчанию всех стандартных элементов управления), который, вероятно, уже устанавливает ItemContainerStyle.
Итак, теперь мой вопрос: есть ли способ по-прежнему использовать мой StyleSelector, чтобы у меня был унаследованный стиль в качестве основы для выбранных стилей? А если нет, то как мне добиться другого стиля только для некоторых строк в зависимости от их типа объекта?
РЕДАКТИРОВАТЬ:
Установка 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}">
Селектор стиля:
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>
{StaticResource StyleSelector}
разрешается в экземплярGridRowStyleSelector
? - person Grx70   schedule 04.05.2016System.Windows.Data Error: 24 : Both 'ItemContainerStyle' and 'ItemContainerStyleSelector' are set; 'ItemContainerStyleSelector' will be ignored.
в окне вывода? - person Grx70   schedule 04.05.2016"System.Reflection.TargetInvocationException" in mscorlib.dll
каждый раз, когда перестраиваю содержимое сетки данных, содержащее GridSeparator - до сих пор не замечал этого, похоже, это связано - person Florian Koch   schedule 04.05.2016StyleSelector.SelectStyle()
вызывается в обычном приложении WPF, но не при использованииMahApps.Metro
. Похоже, его вообще игнорируют. Кстати, никаких исключений в любом случае. - person jsanalytics   schedule 04.05.2016