Привязка внешнего стиля к DataGridRow и использование в стиле внешней переменной

171
04 декабря 2021, 17:20

В проекте есть справочники, вывод осуществляется через DataGrid. Иногда в этих справочниках что-то удаляют, но логика программы их не удаляет совсем, а помечает как удаленные. Простому пользователю нужно отображать просто список элементов справочника, а вот пользователям из группы администраторов нужно отобразить основной список элементов и удаленные. При этом удаленные надо пометить (как вариант цветом). Этот код не работает

Вот код стиля для DataGridRow

<style TargetType="{x:Type DataGridRow}" x:Key="ReferencesDataGridRow">
 <Style.Triggers>
  <MultiDataTrigger>
   <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding DataContext.IsAdmin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}}" Value="false" />
    <Condition Binding="{Binding Path=Deleted}" Value="true" />
   </MultiDataTrigger.Conditions>
   <Setter Property="Visibility" Value="Collapsed" />
  </MultiDataTrigger>
  <MultiDataTrigger>
   <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding DataContext.IsAdmin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}}" Value="true" />
    <Condition Binding="{Binding Path=Hidden}" Value="true" />
   </MultiDataTrigger.Conditions>
   <Setter Property="Background" Value="Pink" />
  </MultiDataTrigger>
 </Style.Triggers>
</Style>

В разметке UserControl применение стиля приходится задавать через ресурсы UserControl, так как непосредственно в DataGrid установка стиля DataGridRow приводит к ошибке ArgumentNullException

<UserControl.Resources>
 <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource ReferencesDataGridRow}" />
</UserControl.Resources>

DataGrid

<DataGrid x:Name="VendorsGrid" ItemSource="{Binding VendorsList}" SelectedItem="{Binding SelectedVendor}">
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>

Привязка осуществляется в .cs файле UserControl

DataContext=MainWindowViewModel.This.CurrentDocument;

ViewModel рассматриваемого UserControl

...
public bool IsAdim=>UserConfig.IsAdmin;
public VendorModel SelectedVendor
{
 get=>_selectedVendor;
 set=>Set(ref _selectedVendor,value);
}
public ObservableCollection<VendorModel>VendorList{get;}
...

Стиль никак не применяется к DataGrid

Собственно вопрос: что не так с разметкой, почему стиль не хочет применяться к DataGrid?

p.s. метод Set() реализует интерфейс INotifyPropertyChanged, который любезно подсказал @VladID

Спасибо

Answer 1

В ходе экспериментов выяснил, что применение стиля через DataGrid.RowStyle вполне работает. Может это только у меня так отработало, но результат есть

<DataGrid>
 <DataGrid.RowStyle>
  <Style TargetType={x:Type DataGridRow}" BasedOn="{StaticResource ReferenceDataGridRow}" />
 </DataGrid.RowStyle>
...
</DataGrid>
READ ALSO
Как получить список вещей из инвентаря Unity Steam?

Как получить список вещей из инвентаря Unity Steam?

На C# необходимо получить список вещей в инверторе SteamДля получения пытался использовать Stemworks API и Facepunch Stemworks

226
Не работает strtotime() с полученными датами

Не работает strtotime() с полученными датами

Я пытаюсь получить в функции номер текущей недели и года, а затем преобразовать его в формат с русским языком, для чего и добавил перевод месяцев...

200
Очередь отложенных сообщений

Очередь отложенных сообщений

Появилась задача, сделать демона, который будет выполнять задачи по расписаниюСначала я думал все эти задачи сохранять в таблицу и демон...

70