2014-10-21 4 views
0

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

У меня есть рабочие таблицы (таблицы) в рабочем пространстве. Все динамические (столбцы, монтирование таблиц, ...). Основываясь на объекте для рабочего листа, я хотел бы установить поворот datagrid.

В.М. Структура:

ControlVM : 
{ Workspace: [ 
    { 
    Worksheet: [ 
    {  
     DataViewBindingData: [DataView type],  
     isRotated: rue | false  
    }, 
    {...} 
    ] 
} 


<ScrollViewer Grid.Column="0" Grid.Row="0" > 
       <ItemsControl ItemsSource="{Binding Path=Workspace}" > 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
         <StackPanel> 
          <Expander Header="{Binding Path=WorksheetName}" ExpandDirection="Down" IsExpanded="True" > 
            <StackPanel> 
             <DataGrid CanUserResizeColumns="False" HeadersVisibility="Column" CanUserSortColumns="False" HorizontalAlignment="Stretch" CanUserAddRows="False" Margin="5" 
                SelectionUnit="Cell" SelectionMode="Single" ItemsSource="{Binding Path=DataViewBindingData}" Loaded="DataGrid_Loaded" 
                BeginningEdit="DataGrid_BeginningEdit" /> 
            </StackPanel> 
           </Expander> 
          </StackPanel> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </ScrollViewer> 

И внутри пользовательских стилей ресурсы в моем базовом стиле для управления (заголовок, клетки), я пытаюсь получить доступ к isRotated свойство рабочего листа объекта

<Style x:Key="DataGridBase" TargetType="Control"> 
    <Style.Triggers> 
     <!-- TODO cannot find an ancestor for data binding --> 
     <DataTrigger Binding="{Binding IsRotated, Converter={StaticResource DebugConverter}, Mode=OneWay}" Value="True"> 
      <Setter Property="LayoutTransform"> 
       <Setter.Value> 
        <TransformGroup> 
         <RotateTransform Angle="-90" /> 
         <ScaleTransform ScaleX="-1" ScaleY="1" /> 
        </TransformGroup> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="TextOptions.TextFormattingMode" Value="Display" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style > 

<!--DataGrid Cells--> 
<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource DataGridBase}" /> 

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

ответ

0

Неявный DataContext внутри DataGridCell - фактически текущий элемент данных DataGridRow. Так что в этом случае вы должны использовать RelativeSource найти DataGrid и установить Path в DataContext.IsRotated (DataContext DataGrid «s является Worksheet):

<DataTrigger Binding="{Binding DataContext.IsRotated, 
         RelativeSource={RelativeSource AncestorType=DataGrid} 
         Converter={StaticResource DebugConverter}, Mode=OneWay}" 
       Value="True"> 
<!-- ... --> 
+0

Спасибо за ответ! Я придумал подобное решение, но проблема, в которой я застряла, заключается в том, что DataGrid использует свойство, называемое DataViewBindingData, и на том же уровне (свойство) is isRotated. Итак, как вы можете получить доступ к этому из ItemSource datagrid? Рабочая область - [имеет много] -> Рабочий лист {DataViewBindingData, IsRotated} и ItemSource для DataGrid - DataViewBindingData. Код: ObservableCollection Рабочее пространство. Спасибо за вашу помощь, оцените его – stenly

+0

@stenly вы действительно пробовали этот код? Я знаю, что 'ItemsSource' привязан к DataViewBindingData', поскольку DataContext DataGrid должен быть« Worksheet », а« Worksheet »имеет свойство IsRotated. Таким образом, код, который я опубликовал в моем ответе, поможет связать «IsRotated» и проверить значение «True» в DataTrigger. –

+1

это работает :) но как это возможно? Спасибо за помощь – stenly

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