【问题标题】:WPF DataGrid row color by item property nameWPF DataGrid 行颜色按项目属性名称
【发布时间】:2017-11-22 09:28:18
【问题描述】:

我有这个 DataGridRow 模板(已简化):

<Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">        
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridRow}">
                <Grid>
                    <Border x:Name="OverlayBorder" Opacity="0.08">
                        <Border.Background>
                            <LinearGradientBrush EndPoint="0,0" StartPoint="10,10"
                                                 MappingMode="Absolute" SpreadMethod="Repeat">
                                <GradientStop Color="{Binding EntityState, Converter={resources:EntityStateToColorConverter}}" Offset="0" />
                                <GradientStop Color="{Binding EntityState, Converter={resources:EntityStateToColorConverter}}" Offset="0.4" />
                                <GradientStop Color="Transparent" Offset="0.4" />
                                <GradientStop Color="Transparent" Offset="1" />
                            </LinearGradientBrush>
                        </Border.Background>
                    </Border>
                    <Border x:Name="DGR_Border"
                            Background="{TemplateBinding Background}">
                        <DataGridCellsPresenter />
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="{DynamicResource DataGridRowBackgroundHover}" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{StaticResource DataGridRowBackgroundSelected}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>                    
</Style>

我还有一些课:

public class EntityWithState
{
    public EntityStateEnum EntityState { get; set; }
}

模板适用于类EntityWithState。看看这一行

<GradientStop Color="{Binding EntityState, Converter={resources:EntityStateToColorConverter}}" Offset="0" />

根据EntityWithState.EntityStateDataGridRow 设置渐变背景。

但如果我有其他课程:

public class EntityWithEntityWithState
{
    public EntityWithState EntityWithState { get; set; }
}

我们的模板必须是:

<GradientStop Color="{Binding EntityWithState.EntityState, Converter={resources:EntityStateToColorConverter}}" Offset="0" />``

我的问题是如何为多个课程使用相同的模板? 我认为附加财产对我有帮助。例如:

<DataGrid UiExtensions:DataGrid.StatePropName="EntityWithState.EntityState">
...
</DataGrid>

但我不知道如何实现它。或者如果有其他解决方案...

更新(2017 年 11 月 22 日)

我可以使用

public class EntityWithEntityWithStateViewModel
{
    public EntityWithEntityWithState EntityWithEntityWithState { get; set; }
    public EntityStateEnum EntityState => EntityWithEntityWithState.EntityWithState.EntityState;
}

但我想在没有 ViewModel 访问权限的情况下执行此操作,仅使用 XAML 和 UI

更新 2 (23.11.2017)

换句话说,我需要 DisplayMemberPathComboBoxListBox 之类的东西

【问题讨论】:

    标签: wpf datagrid attached-properties


    【解决方案1】:

    我的问题是如何为多个课程使用相同的模板?

    简短的回答:你不能。

    恐怕您不能只替换绑定路径并重新使用模板的其余部分。模板总是被定义为“整体”:

    WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?

    所以在 XAML 中没有办法做到这一点。您可能需要考虑以编程方式创建模板:

    How generate custom columns for FrameworkElementFactory(typeof(Datagrid))?

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2021-01-11
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2020-08-05
      • 2017-09-18
      • 1970-01-01
      • 2017-06-16
      相关资源
      最近更新 更多