【发布时间】: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