Как переместить повторяющиеся стили в раздел ресурсов? - PullRequest
0 голосов
/ 25 августа 2011

У меня есть следующий xaml-код.

<tk:DataGrid
    ItemsSource="{Binding Path=Products}"
    AutoGenerateColumns="False">
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn
                    Header="Id">
            <tk:DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type tk:DataGridCell}">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Margin="0,10"  Text="{Binding Path=Id}" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </tk:DataGridTextColumn.CellStyle>
        </tk:DataGridTextColumn>
        <tk:DataGridTextColumn
                    Header="Product">
            <tk:DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type tk:DataGridCell}">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock Margin="0,10"  Text="{Binding Path=Name}" />
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </tk:DataGridTextColumn.CellStyle>
        </tk:DataGridTextColumn>
    </tk:DataGrid.Columns>
</tk:DataGrid>

Как мне избавиться от копирования-вставки?Простой способ перемещения его к ресурсам не работает, потому что Text = "{Binding Path = XYZ}" перестает работать.

1 Ответ

0 голосов
/ 25 августа 2011

Я не думаю, что вы можете делать то, что вы хотите здесь, то есть иметь одно определение шаблона для обеих ячеек. Однако использование DataGridTemplateColumn приведет к удалению некоторых строк XAML (это немного странно, если использовать DataGridTextColumn, а затем перезаписать его шаблон элемента управления):

    <DataGrid ItemsSource="{Binding Path=Products}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="ID">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Margin="10,0" Text="{Binding Path=ID}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Name">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Margin="10,0" Text="{Binding Path=Name}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

Есть и другой способ, на этот раз с использованием DataGridTextColum, который должен дать вам что-то близкое к тому, что вы хотите:

    <DataGrid Name="ui_datagrid" AutoGenerateColumns="False">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Padding" Value="0,10"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                            <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>
...