有没有人有一个如何创建自定义datagrid列的正确功能示例?我想制作一个具有更多可绑定属性(即value,decimalCount,unit)。我不想使用模板列。
我的主要问题是我无法弄清楚如何在我的控制中获得正确的datacontext。我继承了DataGrid的上下文,并且无法获取每行的单个项目。
我为控件添加了依赖项属性,但是当它们尝试绑定到父集合上的属性时,它们最终只是为空。
好的,这是我的未来尝试之一:using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Project.Common.Converters;
namespace Project.Areas.Schedule
{
public class ColumnTest2 : DataGridColumn
{
public static readonly DependencyProperty UnitProperty = DependencyProperty.Register("Unit", typeof(string), typeof(ColumnTest), new PropertyMetadata(default(string)));
public string Unit
{
get { return (string)GetValue(UnitProperty); }
set { SetValue(UnitProperty, value); }
}
public static readonly DependencyProperty DecimalCountProperty = DependencyProperty.Register("DecimalCount", typeof(int), typeof(ColumnTest), new PropertyMetadata(default(int)));
public int DecimalCount
{
get { return (int)GetValue(DecimalCountProperty); }
set { SetValue(DecimalCountProperty, value); }
}
public static readonly DependencyProperty QuantityProperty = DependencyProperty.Register("Quantity", typeof(decimal), typeof(ColumnTest), new PropertyMetadata(default(decimal)));
public decimal Quantity
{
get { return (decimal)GetValue(QuantityProperty); }
set { SetValue(QuantityProperty, value); }
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
if (Quantity == null || DecimalCount == null || Unit == null)
return null;
TextBlock cellElement = new TextBlock();
var valueBinding = new MultiBinding
{
Converter = new QuantityToStringMultiValueConverter(),
Bindings =
{
new Binding{Source = dataItem, Path=Quantity.Path},
new Binding{Source = dataItem, Path=DecimalCount.Path},
new Binding{Source = dataItem, Path=Unit.Path},
}
};
cellElement.SetBinding(TextBlock.TextProperty, valueBinding);
return cellElement;
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
return null;
}
}
}
用法:
<DataGrid ItemsSource="{Binding ScheduleLines}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CustomerName}" Header="Normal Column"/>
<schedule:ColumnTest2 Quantity="{Binding DeliveredQuantity}" DecimalCount="{Binding Decimals}" Unit="{Binding Unit}" Header="Custom Column"/>
</DataGrid.Columns>
</DataGrid>
如果你在视觉工作室中尝试这个,你会在&#34; normal&#34;列intellisense知道我们正在查看项目级别的项目,而在我们新尝试的自定义列intellisense建议父级别的项目(这也是真正的运行时 - 所以它没有找到属性)。
PS:转换器类可以在这里找到:http://pastebin.com/hbrxVRw6