2

如何将样式应用于内容控件的内容。例如:

<Window.Resources>
    <Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False">
        <Controls:DataGrid.Columns>
            <Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
            <Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
        </Controls:DataGrid.Columns>
    </Controls:DataGrid>
</Window.Resources>

<StackPanel>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}" Style="DataGridStyle1"></ContentControl>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}" Style="DataGridStyle2"></ContentControl>
</StackPanel>
4

1 回答 1

4

编辑 2:看起来您正在尝试对每个 DataGrid 应用不同的样式。为此,您需要在每个 ContentControl 的资源部分中定义它们的特定样式。如果样式在别处定义,您始终可以基于别处定义的样式创建新样式,如下所示

第一个 ContentControl 的 DockPanel 的背景将是黑色。第二个将是蓝色。

<Window.Resources>
    <Style TargetType="DockPanel" x:Key="DockStyle1">
        <Setter Property="Background" Value="Black" />
    </Style>
    <Style TargetType="DockPanel" x:Key="DockStyle2">
        <Setter Property="Background" Value="Blue" />
    </Style>
    <DockPanel x:Key="MyDockPanel">
        <Rectangle Fill="Green" DockPanel.Dock="Top" Height="20" Width="50" />
        <Rectangle Fill="Red" DockPanel.Dock="Top" Height="20" Width="20" />
        <Rectangle Fill="Yellow" DockPanel.Dock="Bottom" Height="20" Width="50" />
    </DockPanel>
</Window.Resources>
<StackPanel>
    <StackPanel>
        <ContentControl Content="{StaticResource MyDockPanel}">
            <ContentControl.Resources>
                <Style TargetType="{x:Type DockPanel}" BasedOn="{StaticResource DockStyle1}" />
            </ContentControl.Resources>
        </ContentControl>
        <ContentControl Content="{StaticResource MyDockPanel}">
            <ContentControl.Resources>
                <Style TargetType="DockPanel" BasedOn="{StaticResource DockStyle2}" />
            </ContentControl.Resources>
        </ContentControl>
    </StackPanel>
</StackPanel>

编辑3 - 对于你的例子,我认为你想要这样的东西(但是我无法测试这个,因为我无权访问你的'Controls'命名空间):

<Window.Resources>
    <Controls:DataGrid x:Key="PersonDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding .}" x:Shared="False">
        <Controls:DataGrid.Columns>
            <Controls:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
            <Controls:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
        </Controls:DataGrid.Columns>
    </Controls:DataGrid>
</Window.Resources>

<StackPanel>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Customers}">
        <ContentControl.Resources>
            <Style TargetType="{x:Type Controls:DataGrid}" BasedOn="{StaticResource DataGridStyle1}" />
        </ContentControl.Resources>
    </ContentControl>
    <ContentControl Content="{StaticResource PersonDataGrid}" DataContext="{Binding Path=Employees}">
        <ContentControl.Resources>
            <Style TargetType="{x:Type Controls:DataGrid}" BasedOn="{StaticResource DataGridStyle2}" />
        </ContentControl.Resources>
    </ContentControl>
</StackPanel>

不幸的是,您不能按照为什么我不能设置 DataGridTextColumn 的样式?

相反,我通常将 DataGridTextColumn 的 CellStyle 设置为“样式”:

<Style TargetType="DataGridCell" x:Key="DataGridCenteredText">
    <Setter Property="TextBlock.TextAlignment" Value="Center" />
</Style>

<DataGridTextColumn Header="Centered Text" CellStyle="{StaticResource DataGridCenteredText}" Binding="{Binding Path=MyData}" />

我认为你需要在每列的基础上定义 CellStyle (我想不出你为什么不这样做的任何原因。)

于 2011-04-20T14:05:22.490 回答