DataGrid и DataGridTemplateColumn - PullRequest
       3

DataGrid и DataGridTemplateColumn

1 голос
/ 23 ноября 2010


У меня в приложении несколько DataGrid, и у каждого из них один и тот же «шаблон». Например, вот как определяется каждая DataGrid:

<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
    <DataGridTemplateColumn CanUserResize="False"
        CanUserSort="False"
            CanUserReorder="False"
            CellStyle="{StaticResource RightCellStyle}">
...

Как я могу определить «DataGridTemplateColumn» как шаблон во внешнем файле ресурсов, поэтому мне просто нужно написать что-то вроде

<DataGridTemplateColumn Style={StaticResource MyFirstColumn}/>

В «MainGridStyle» я определяю свойства, такие как «CanUserAddRows», ...

Заранее спасибо за помощь.
Fred

Ответы [ 3 ]

4 голосов
/ 23 ноября 2010

Вы говорите о 4 разных вещах:

  • стиль dataGrid
  • шаблон DataGrid
  • стиль вашего первого столбца
  • шаблон вашего первого столбца

, поэтому давайте сначала уточним: выберите один и придерживайтесь его, старайтесь не смешивать стиль и шаблон (один может содержать другой)

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

Это должно быть довольно просто:

1) сначала объявите шаблон вашего столбца (илиstyle) в словаре ресурсов (желательно в ресурсах вашего приложения):

<Application.Resources>
    <Template TargetType="DataGridTemplateColumn" x:Key="MyFirstColumnTemplate ">
    ...
    </Template>
</Application.Resources>

2) затем просто назовите его так, как вы хотели:

<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Template="{StaticResource MyFirstColumnTemplate}"/>
        ...
    </DataGrid.Columns>
<DataGrid>

EDIT:

в случае dataGridTemplateColumn, поскольку у вас есть только доступные свойства CellTemplate и CellEditingTemplate, вы можете сделать следующее:

<Application.Resources>
     <DataTemplate x:Key="CellTemplate">
     ...
     </DataTemplate>
     <DataTemplate x:Key="CellEdintingTemplate">
     ...
     </DataTemplate>
</Application.Resources>

<DataGrid Style="{StaticResource MainGridStyle}">
    <DataGrid.Columns>
        <DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/>
        ...
    </DataGrid.Columns>
<DataGrid>

заявление об отказе от ответственности: я не уверен, еслиэто controlTemplate или dataTemпластина для ячейки (Редактирование) шаблона, попробуйте оба и посмотрите, какой из них подходит

1 голос
/ 23 ноября 2010

Поскольку DataGridTemplateColumn не имеет свойства Style, вы можете создать присоединенное свойство.

Ниже приведен пример:

[ ПРИМЕЧАНИЕ. Вам может потребоваться изменить следующий код в соответствии с вашим проектом.]

Класс с прикрепленным свойством -

public class StyleExtensions
{
    public static Style GetStyle(DependencyObject obj)
    {
        return (Style)obj.GetValue(StyleProperty);
    }

    public static void SetStyle(DependencyObject obj, Style value)
    {
        obj.SetValue(StyleProperty, value);
    }

    public static void StyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Style style = e.NewValue as Style;
        if (style != null)
        {
            foreach (var s in style.Setters.OfType<Setter>())
            {
                d.SetValue(s.Property, s.Value);
            }
        }
    }

    // Using a DependencyProperty as the backing store for Style.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StyleProperty =
        DependencyProperty.RegisterAttached("Style", typeof(Style), typeof(StyleExtensions), new UIPropertyMetadata(StyleChanged));
}

Определение Style -

    <Style x:Key="MyFirstColumn">
        <Setter Property="DataGridColumn.CanUserResize"
                Value="False" />
        <Setter Property="DataGridColumn.CanUserSort"
                Value="False" />
        <Setter Property="DataGridColumn.CanUserReorder"
                Value="False" />
        <Setter Property="DataGridColumn.CellStyle"
                Value="{StaticResource RightCellStyle}" />
    </Style>

Использование -

            <DataGrid>
                <DataGrid.Columns>
                    <DataGridTemplateColumn local:StyleExtensions.Style="{StaticResource MyFirstColumn}"></DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
0 голосов
/ 23 ноября 2010

Для "внешнего" файла ресурсов вы можете просто поместить его в словарь ресурсов, который вы вызываете в файле app.xaml:

в вашем файле "customTemplates.xaml":

<ResourceDictionary>
...
</ResourceDictionary>

и затем в вашем файле "app.xaml":

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="customTemplates.xaml" />
            ...
            //add other resource dictionaries here if any
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...