【问题标题】:Binding to WPF DataGrid cell value from within template从模板中绑定到 WPF DataGrid 单元格值
【发布时间】:2011-06-08 11:05:26
【问题描述】:

我有一组在 DataGrid 中显示的自定义数据对象。这些列是在运行时动态创建的。一些列是 TemplateColumns,它们在 TextBlock 中将值显示为带有相应文本的进度条; brogressbar 本身是从 Style 定义的:

private string CreateProgressBarColumnTemplate(string fieldName)
{
    StringBuilder CellTemp = new StringBuilder();
    CellTemp.Append("<DataTemplate ");
    CellTemp.Append("xmlns='http://schemas.microsoft.com/winfx/");
    CellTemp.Append("2006/xaml/presentation' ");
    CellTemp.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>");
    CellTemp.Append(String.Format("<ProgressBar Margin=\"0,1,0,0\" MinWidth=\"100\" MaxWidth=\"Infinity\" MaxHeight=\"Infinity\" Width=\"Auto\" Height=\"Auto\" HorizontalAlignment=\"Stretch\"  VerticalAlignment=\"Stretch\" Value=\"{{Binding {0}}}\" Style=\"{{StaticResource ProgressBarStyle}}\"/>", fieldName));
    CellTemp.Append("</DataTemplate>");
    return CellTemp.ToString();
}

private DataGridTemplateColumn CreateProgressBarTemplateColumn(string fieldName, string columnHeader)
{
    DataGridTemplateColumn column = new DataGridTemplateColumn();
    column.CanUserSort = true;
    column.CanUserResize = false;
    column.Header = columnHeader;
    column.CellTemplate = (DataTemplate)XamlReader.Parse(CreateProgressBarColumnTemplate(fieldName)); //display template
    return column;
}
<Style x:Key="ProgressBarStyle" TargetType="ProgressBar">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ProgressBar">
                <Border BorderBrush="#BBC6C4" BorderThickness="1" CornerRadius="5" Padding="1">
                    <Grid x:Name="PART_Track" >
                        <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left" RadiusX="5" RadiusY="5">
                            <Rectangle.Fill>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#FF1D5666" Offset="1"/>
                                    <GradientStop Color="#FF09B6FF"/>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>
                        <TextBlock FontFamily="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=FontFamily}" 
                                   FontSize="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=FontSize}" 
                                   FontWeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=FontWeight}" 
                                   TextAlignment="Center" 
                                   Background="Transparent" 
                                   DataContext="{TemplateBinding Value}" 
                                   Foreground="{Binding Converter={StaticResource ValueToColor}}" x:Name="ProgressText" 
                                   Margin="0,-3,0,0" 
                                   Text="{Binding Converter={StaticResource DoubleToPercentage}}"
                                   />
                    </Grid>              
                </Border>       
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如您所见,TextBlock DataContext 设置为 Progressbar 的 Value 属性,TextBlock.Text 是从中设置的。

问题是 Value 属性不能高于 MaxValue(如果我尝试分配更大的值,Value 似乎设置为 MaxValue),即使实际单元格值大于,我的 TextBlock.Text 也将始终显示 100%这个。

问题是,如何将 TextBlock.Text 属性绑定到实际单元格值(我的自定义数据对象上的属性,它是动态的)而不是进度条?

【问题讨论】:

  • 您不应通过解析 XAML 字符串来创建模板。

标签: wpf templates xaml data-binding datagrid


【解决方案1】:

您可以使用ProgressBar.Tag 属性将值代理到 ControlTemplate 中的 TextBlock。但实际上,这应该是一个自定义控件(即 MyProgressBar),它公开了一个新的依赖属性(即 Text)。

要使用标签,您需要添加:

CellTemp.Append(String.Format("<ProgressBar ... Tag=\"{{Binding {0}}}\" ... />", fieldName));

将你的 TextBlock 绑定到它:

<TextBlock ... DataContext="{TemplateBinding Tag}" ... />

【讨论】:

  • 话虽如此,尽管它对我有用,但它并不能真正回答问题。理想情况下,我不想通过 TemplateBinding 绑定,甚至不通过 RelativeSource TemplatedParent 绑定,而是绑定到我的 DataGridRow 中包含的属性
  • @StaWho 我也有类似的问题。你有没有想过如何绑定到 DataGridRow?
猜你喜欢
  • 2010-10-24
  • 2017-10-04
  • 2016-03-26
  • 2017-11-05
  • 2013-12-27
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多