2017-01-25 8 views
0

Я работаю на DB интерфейсного с WPF/EntityFramework/MVVMWPF DataGrid Пользовательских строки заголовок

Теперь я застрял, когда я позволить пользователю добавлять данные в DataGrid (который связан с наблюдаемым Collection).

Что я хочу добиться, чтобы получить заголовок строки, как в MS Access: Так что мой WPF DataGrid должен выглядеть это в основном:

access datagrid

Есть ли способ, чтобы привязать RowHeaderStyle для RowState? Для примера:

  • RowState.Editing: Показать Edit Icon
  • RowState.NewRow: Показать Star
  • RowState.Default: Показать По умолчанию строка заголовка

Я не нашел никакого решения до сих пор, но я думаю, что WPF должен быть достаточно сильным, чтобы выполнить эту работу.

Спасибо!

+0

P.S .: я не забочусь о чередующихся цветах строк, я знаю, что это может сделать, установив 'AlternatingRowBackground'in в DataGrid – CeOnSql

ответ

1

Простой. Дайте DataGrid a RowHeaderStyle, который свопирует в разные ContentTemplates в зависимости от состояния DataGridRow. К счастью, DataGridRow является визуальным предком DataGridRowHeader, поэтому относительно просто связаться с привязкой RelativeSource и получить значения соответствующих свойств: DataGridRow.IsEditing и DataGridRow.IsNewItem.

Я использовал <Label>New</Label> и т. Д. В качестве произвольного стенда для любого контента, который вы хотите использовать.

<DataGrid 
    ItemsSource="{Binding Rows}" 
    > 
    <DataGrid.RowHeaderStyle> 
     <Style 
      TargetType="{x:Type DataGridRowHeader}" 
      BasedOn="{StaticResource {x:Type DataGridRowHeader}}" 
      > 
      <!-- 
      Empty content template for default state. 
      Triggers below replace this for IsNewItem or IsEditing. 
      --> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Label></Label> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 

      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding 
         IsEditing, 
         RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" 
        Value="True" 
        > 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Label>Edit</Label> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 

       <DataTrigger 
        Binding="{Binding 
         IsNewItem, 
         RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" 
        Value="True" 
        > 
        <Setter Property="ContentTemplate"> 
         <Setter.Value> 
          <DataTemplate> 
           <Label>New</Label> 
          </DataTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowHeaderStyle> 
</DataGrid>    
+0

Спасибо вашего для вашего ответа, но это не похоже на работу. Возможно, есть проблема с привязкой к 'RowState'. Триггер «Binding =» {Binding RowState} «Value =« EditRow »', например, никогда не срабатывает, на мой взгляд !? – CeOnSql

+0

@CeOnSql Мне пришлось делать предположения, потому что вы не указали много информации о своих моделях. Является ли свойство 'RowState' для элементов строки? Это называется 'RowState'? Повышает ли значение 'INotifyPropertyChanged.PropertyChanged', когда изменяется его значение? Если вы разделите источник для самого элемента строки, который ответит на эти вопросы. –

+0

Я думаю, что вы ошиблись, 'RowState' не является свойством моих базовых объектов! С 'RowState' я имел в виду свойство DataGrid (если это уже существует !?) – CeOnSql