有人请帮我解决这个问题。我有一个数据网格,我需要一切都具有完全可扩展的大小。我对列标题没有任何问题,它们都可以正确缩放。我的问题是针对个体细胞,他们似乎并不尊重他们的约束力。
我必须将DataGridTextColumn子类化以添加一些自定义功能。我有一个名为CreateDataGridColumn的方法,它返回对ExtendedDataGridTextColumn的引用。然后将这些列添加到数据网格中。数据绑定本身工作正常,网格显示所有正确的数据。网格高度的绑定似乎设置初始值很好,但是一旦显示网格,如果绑定的变量发生变化,它就不会改变高度。
以下是一些代码:
private ExtendedDataGridTextColumn CreateDataGridColumn(EntityBase dataColumn, FormatConditionGroup formatConditionGroup)
{
ExtendedDataGridTextColumn newColumn = new ExtendedDataGridTextColumn(dataColumn);
DataTemplate dataTemplate = new DataTemplate();
String textBlockName = "Text" + dataColumn.EntityId;
String columnTag = dataColumn.GetPropertyValue("Tag");
// Create the TextBlock that will display the cell contents
FrameworkElementFactory textBlockFNFactory;
textBlockFNFactory = new FrameworkElementFactory(typeof(TextBlock));
_gridTextHeightPercentage = dataColumn.GetPropertyDouble("GridFontSize", Constants.DefaultFontHeightPercent) / 2.8;
_fontSize = GlobalVariables.DesignerPreviewHeight * (_gridTextHeightPercentage / 100);
Binding binding = new Binding();
binding.Source = _fontSize;
textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);
// Do a whole bunch of stuff here
// Create a border so that the label background does not obscure the grid lines
FrameworkElementFactory borderFNFactory;
borderFNFactory = new FrameworkElementFactory(typeof(Border));
borderFNFactory.AppendChild(textBlockFNFactory);
// Add type to data template
dataTemplate.VisualTree = borderFNFactory;
newColumn.CellTemplate = dataTemplate;
return newColumn;
}
然后我在datagrid的SizeChanged事件上触发了以下方法:
_customDataGrid.TitleAreaHeight = new GridLength(GlobalVariables.DesignerPreviewHeight * (_titleHeightPercentage / 100));
_customDataGrid.SetHeaderFontSize(GlobalVariables.DesignerPreviewHeight * (_headerHeightPercentage / 100));
_fontSize = GlobalVariables.DesignerPreviewHeight * (_gridTextHeightPercentage / 100);
前两行执行它们应该的操作,更改标题区域的高度,这是我添加到数据网格中并更改标题高度。但_fontSize变量的更新不会更改数据网格单元格文本高度。
更新
根据建议我添加了依赖属性。
public static readonly DependencyProperty GridFontHeightProperty = DependencyProperty.Register("GridFontHeight", typeof(double), typeof(CustomDataGrid));
然后将我的绑定代码更改为此。
binding = new Binding();
binding.Path = new PropertyPath("GridFontHeight");
textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);
然后在我的尺寸改变了这个。
SetValue(GridFontHeightProperty, _fontSize);
但它不起作用。在这种情况下,它没有正确设置字体高度,它只使用数据网格的默认字体高度。
答案 0 :(得分:1)
首先,不能绑定到私有变量。我的猜测是,你的变量_fontSize是private double
,对吗? (看看我怎么猜?))
您可以绑定到公共属性或依赖属性,在您的情况下适合。因此,创建一个名为FontSize的新依赖项属性并绑定到该属性。
如果由于某种原因你不能使用依赖属性,你仍然可以使用INotifyPropertyChanged绑定到普通的CLR属性,它应该类似于
public double FontSize
{
get{return _fontSize;}
set
{
_fontSize = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("FontSize"));
}
}
}
答案 1 :(得分:0)
你没有正确装订,也不能(严格地说)你想要的东西。
绑定总是针对普通代码属性或针对依赖项属性。您无法绑定到字段。你可以这样做:
首先,删除_fontSize
实例变量。你不会再使用它了。
接下来,为此值定义DependencyProperty
:
private const string FontSizePropertyName = "FontSize";
private static readonly DependencyProperty FontSizeProperty =
DependencyProperty.Register(
FontSizePropertyName,
typeof(double),
typeof(ExtendedDataGridTextColumn),
new UIPropertyMetadata(0));
private double FontSize
{
get { return (double)GetValue(FontSizeProperty); }
set { SetValue(FontSizeProperty, value); }
}
然后将绑定更改为:
Binding binding = new Binding();
binding.Source = RelativeSource.Self;
binding.Path = new PropertyPath(FontSizeProperty)
textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);
然后只需使用新的FontSize
属性来设置值,而不是更新私有字段。
注意:您与现有的依赖项属性很接近,但如果属性是CLR(普通)属性,则PropertyPath
只需string
。对于依赖项属性,您应该将实际的DependencyProperty
实例传递给它,如上所示。
答案 2 :(得分:0)
我对此有几点意见......
ExtendedDataGridTextColumn
DataGridTextColumn
是否延伸至CellTemplate
,如果是这样,你如何使用DataGridTextColumn
? ElementStyle
有EditingElementStyle
和CellTemplate
来设置由其单元格表示的TextBlock和TextBox的样式。
如果您对上述第1点中 Binding binding = new Binding();
binding.BindsDirectlyToSource = true;
binding.Source = _fontSize;
textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);
的决定有信心,请尝试....
{{1}}
如果有任何帮助,请告诉我。