使用DataTrigger在DataGridTemplateColumn而不是DataTemplateSelector中显示“脏”值

时间:2013-02-11 15:56:14

标签: wpf datagrid datatrigger datagridtemplatecolumn

我仍然遇到了一些WPF问题。我觉得这可能是一个简单的问题,我想知道为什么我不能像我认为的那样让它工作。

我正在尝试使用DataTrigger来显示我的DataGrid中的值是“脏的”,这意味着自上次将数据提交到数据库以来其值已更改。绑定到我的网格视图的项目具有正常工作的IsDirty属性。我正在尝试在网格中的单元格中的TextBlock中使用红色星号来指示存在未提交的更改,在我的DataGrid.Resources中使用DataTrigger,就像这样。我们的想法是,如果所选行项目上的IsDirty为True,字体颜色将从透明变为红色:

            <DataTemplate x:Key="CleanTemplate">
                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="*" Padding="0,0,5,0" Foreground="Transparent" FontWeight="Bold" FontFamily="Lucida Console" >
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Style.Triggers>
                                    <!-- Not sure why this isn't working... this text block can't see changes in IsDirty for some reason-->
                                    <DataTrigger Binding="{Binding Path=IsDirty}" Value="True">
                                        <Setter Property="Foreground" Value="Red" />
                                    </DataTrigger>                                                                                                                    
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
                    <Label Grid.Column="1" Foreground="DarkGray" Background="Transparent" VerticalContentAlignment="Center" Content="{Binding Path=Value,Mode=OneWay,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" />
                </Grid>
            </DataTemplate>

我的猜测是,样式触发器的DataContext与实际TextBlock的DataContext(以及DataGrid中也是部分单元格的Label)不同,我需要更改绑定路径以便触发器可以“看到”所选项目及其属性。我不确定如何导航到可以在网格中看到所选项目属性的位置。

我能够通过DataGridTemplateColumn上的CellTemplateSelector来使用它,但是客户正在根据所选行的数据类型请求不同的输入控件,所以现在我的数据模板选择标准变得越来越复杂(现在我需要为每个单独的控件创建一个模板,并且除了显示值IsDirty之外,它基本上是相同的。)

XAML:

    <DataGridTemplateColumn
        Header="Value"
        Width="*"
        MinWidth="25"
    >
        <DataGridTemplateColumn.CellTemplateSelector>
            <local:ParameterStateTemplateSelector 
                CleanTemplate="{StaticResource CleanTemplate}"
                CleanTemplateYN="{StaticResource CleanTemplateYN}"
                DirtyTemplate="{StaticResource DirtyTemplate}"
                DirtyTemplateYN="{StaticResource DirtyTemplateYN}"
            />
        </DataGridTemplateColumn.CellTemplateSelector>
    </DataGridTemplateColumn>

Label类型数据的模板(不同之处在于TextBlock的前景是透明或红色,具体取决于IsDirty):

    <DataTemplate x:Key="CleanTemplate">
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Text="*" Padding="0,0,5,0" Foreground="Transparent" FontWeight="Bold" FontFamily="Lucida Console" />
            <Label Grid.Column="1" Foreground="DarkGray" Background="Transparent" VerticalContentAlignment="Center" Content="{Binding Path=Value,Mode=OneWay,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" />
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="DirtyTemplate">
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Text="*" Padding="0,0,5,0" Foreground="Red" FontWeight="Bold" FontFamily="Lucida Console"/>
            <Label Grid.Column="1" Foreground="DarkGray" Background="Transparent" VerticalContentAlignment="Center" Content="{Binding Path=Value,Mode=OneWay,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" />
        </Grid>
    </DataTemplate>

DataTemplateSelector的代码隐藏(看起来像IsDirty的DataTrigger会更简单):

public class ParameterStateTemplateSelector : DataTemplateSelector
{
    public DataTemplate CleanTemplate { get; set; }
    public DataTemplate CleanTemplateYN { get; set; }
    public DataTemplate DirtyTemplate { get; set; }
    public DataTemplate DirtyTemplateYN { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        ScenarioParam selectedItem = (ScenarioParam)item;
            if (selectedItem != null)
        {
            if (selectedItem.ParamObject.DataType == "BOOL")
            {
                if (selectedItem.IsDirty)
                {
                    return DirtyTemplateYN;
                }
                else
                {
                    return CleanTemplateYN;
                }
            }
            else
            {
                if (selectedItem.IsDirty)
                {
                    return DirtyTemplate;
                }
                else
                {
                    return CleanTemplate;
                }
            }
        }
        return base.SelectTemplate(item, container);
    }
}

有关如何让DataTrigger“查看”所选项目属性中的更改的任何建议?或者也许我不想以我想要的方式使用DataTriggers?

谢谢!

0 个答案:

没有答案