有没有可能简化数据网格列?

Is there no possiblity to simplify datagrid columns?

我的 UI 中的每一栏都有相同的设计和功能,但是更新某些内容非常烦人,因为我必须为每一栏都做。有人可以帮我以某种方式简化它吗?我已经在互联网上查找了很多,但我没有找到任何可能性,我想做类似的事情: 等等...

并且只是一种填充数据的布局。

<DataGridTextColumn Binding="{Binding Path=FirstWeek.Monday.Content}" x:Name="Column1" Width="50">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock 
                                Background="{Binding Path=DataContext.ColorsArray[0], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                HorizontalAlignment="Center"
                                Text="Mo" 
                                Grid.Row="0"/>
                            <TextBlock
                                HorizontalAlignment="Center"
                                Text="{Binding Path=DataContext.MonthDaysDate[0], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Grid.Row="1">
                            </TextBlock>
                        </Grid>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="Margin" Value="10,5,10,5"/>
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
                <DataGridTextColumn.CellStyle >
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="MouseUp" Handler="DataGridCell_PreviewMouseUp"/>
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip  Visibility="{Binding FirstWeek.Monday,Converter={StaticResource ContentVisibilityConverter}}">
                                    <StackPanel>
                                        <TextBlock Text="{Binding FirstWeek.Monday.Dienstbezeichnung}"/>
                                        <TextBlock Text="{Binding FirstWeek.Monday.Comment}" Visibility="{Binding FirstWeek.Monday.Comment,Converter={StaticResource ContentVisibilityConverter}}"/>
                                    </StackPanel>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding FirstWeek.Monday, Converter={StaticResource CheckCellItem} }" Value="True"/>
                                    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="{Binding FirstWeek.Monday.ContentColor, Converter={StaticResource ColorStringToColorConverter}}"></Setter>
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=FirstWeek.Tuesday.Content}" x:Name="Column2"  Width="50">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"   />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock 
                                Background="{Binding Path=DataContext.ColorsArray[1], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                HorizontalAlignment="Center"
                                Text="Di" 
                                Grid.Row="0" />
                            <TextBlock
                                HorizontalAlignment="Center"
                                Text="{Binding Path=DataContext.MonthDaysDate[1], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Grid.Row="1"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
              
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="Margin" Value="10,5,10,5"/>
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="MouseUp" Handler="DataGridCell_PreviewMouseUp"/>
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip Visibility="{Binding FirstWeek.Tuesday,Converter={StaticResource ContentVisibilityConverter}}">
                                    <StackPanel>
                                        <TextBlock Text="{Binding FirstWeek.Tuesday.Dienstbezeichnung}"/>
                                        <TextBlock Text="{Binding FirstWeek.Tuesday.Comment}" Visibility="{Binding FirstWeek.Tuesday.Comment,Converter={StaticResource ContentVisibilityConverter}}"/>

                                    </StackPanel>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding FirstWeek.Tuesday, Converter={StaticResource CheckCellItem} }" Value="True"/>
                                    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="{Binding FirstWeek.Tuesday.ContentColor, Converter={StaticResource ColorStringToColorConverter}}"></Setter>
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Binding="{Binding Path=FirstWeek.Wednesday.Content}" Header="Mi" x:Name="Column3" Width="50">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"   />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock 
                                Background="{Binding Path=DataContext.ColorsArray[2], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                HorizontalAlignment="Center"
                                Text="Mi" 
                                Grid.Row="0" />
                            <TextBlock
                                HorizontalAlignment="Center"
                                Text="{Binding Path=DataContext.MonthDaysDate[2], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Grid.Row="1"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="Margin" Value="10,5,10,5"/>
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="MouseUp" Handler="DataGridCell_PreviewMouseUp"/>
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip Visibility="{Binding FirstWeek.Wednesday,Converter={StaticResource ContentVisibilityConverter}}">
                                    <StackPanel>
                                        <TextBlock Text="{Binding FirstWeek.Wednesday.Dienstbezeichnung}"/>
                                        <TextBlock Text="{Binding FirstWeek.Wednesday.Comment}" Visibility="{Binding FirstWeek.Wednesday.Comment,Converter={StaticResource ContentVisibilityConverter}}"/>

                                    </StackPanel>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding FirstWeek.Wednesday, Converter={StaticResource CheckCellItem} }" Value="True"/>
                                    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="{Binding FirstWeek.Wednesday.ContentColor, Converter={StaticResource ColorStringToColorConverter}}"></Setter>
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Binding="{Binding Path=FirstWeek.Thursday.Content}" Header="Do" x:Name="Column4" Width="50">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"   />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock 
                                Background="{Binding Path=DataContext.ColorsArray[3], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                HorizontalAlignment="Center"
                                Text="Do" 
                                Grid.Row="0" />
                            <TextBlock
                                HorizontalAlignment="Center"
                                Text="{Binding Path=DataContext.MonthDaysDate[3], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Grid.Row="1"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="Margin" Value="10,5,10,5"/>
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="MouseUp" Handler="DataGridCell_PreviewMouseUp"/>
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip  Visibility="{Binding FirstWeek.Thursday,Converter={StaticResource ContentVisibilityConverter}}">
                                    <StackPanel>
                                        <TextBlock Text="{Binding FirstWeek.Thursday.Dienstbezeichnung}"/>
                                        <TextBlock Text="{Binding FirstWeek.Thursday.Comment}" Visibility="{Binding FirstWeek.Thursday.Comment,Converter={StaticResource ContentVisibilityConverter}}"/>

                                    </StackPanel>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding FirstWeek.Thursday, Converter={StaticResource CheckCellItem} }" Value="True"/>
                                    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="{Binding FirstWeek.Thursday.ContentColor, Converter={StaticResource ColorStringToColorConverter}}"></Setter>
                            </MultiDataTrigger>
                        </Style.Triggers>

                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTextColumn Binding="{Binding Path=FirstWeek.Friday.Content}" Header="Fr" x:Name="Column5" Width="50">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"   />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <TextBlock 
                                Background="{Binding Path=DataContext.ColorsArray[4], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                HorizontalAlignment="Center"
                                Text="Fr" 
                                Grid.Row="0" />
                            <TextBlock
                                HorizontalAlignment="Center"
                                Text="{Binding Path=DataContext.MonthDaysDate[4], RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                Grid.Row="1"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="TextBlock">
                        <Setter Property="Margin" Value="10,5,10,5"/>
                        <Setter Property="HorizontalAlignment" Value="Center" />
                        <Setter Property="VerticalAlignment" Value="Center" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <EventSetter Event="MouseUp" Handler="DataGridCell_PreviewMouseUp"/>
                        <Setter Property="ToolTip">
                            <Setter.Value>
                                <ToolTip  Visibility="{Binding FirstWeek.Friday,Converter={StaticResource ContentVisibilityConverter}}">
                                    <StackPanel>
                                        <TextBlock Text="{Binding FirstWeek.Friday.Dienstbezeichnung}"/>
                                        <TextBlock Text="{Binding FirstWeek.Friday.Comment}" Visibility="{Binding FirstWeek.Friday.Comment,Converter={StaticResource ContentVisibilityConverter}}"/>
                                    </StackPanel>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding FirstWeek.Friday, Converter={StaticResource CheckCellItem} }" Value="True"/>
                                    <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="{Binding FirstWeek.Friday.ContentColor, Converter={StaticResource ColorStringToColorConverter}}"></Setter>
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

可以将 ElementStyle 定义为资源并使用 StaticResource 标记扩展进行引用。

数据模板更糟,因为您不能动态替换模板中的绑定路径并将其余部分保留在 XAML。

您可以考虑使用 XamlReader.Parse 方法以编程方式创建模板。这将使您可以使用 string.Replace 之类的方法来替换每列的绑定路径。您仍然需要为每列创建一个模板,但它会让您为模板定义一次 XAML 标记。