C# WPF DataGrid自定义列(非templateColumn)

C# WPF DataGrid自定义列(非templateColumn),c#,wpf,datagrid,C#,Wpf,Datagrid,有没有人有关于如何创建自定义datagrid列的适当功能示例?我想制作一个具有更多可绑定属性(即值、小数、单位)的。我不想使用模板列 我的主要问题是我无法弄清楚如何在我的控件中获得适当的datacontext。我继承了DataGrid的上下文,无法深入到每行的单个项 我为控件添加了依赖项属性,但是当它们尝试绑定到父集合上的属性时,结果就是null 好的,下面是我的一个尝试: using System.Windows; using System.Windows.Controls; using Sy

有没有人有关于如何创建自定义datagrid列的适当功能示例?我想制作一个具有更多可绑定属性(即值、小数、单位)的。我不想使用模板列

我的主要问题是我无法弄清楚如何在我的控件中获得适当的datacontext。我继承了DataGrid的上下文,无法深入到每行的单个项

我为控件添加了依赖项属性,但是当它们尝试绑定到父集合上的属性时,结果就是null

好的,下面是我的一个尝试:

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>

如果您在visual studio中尝试此操作,您将看到,在“普通”列上,intellisense知道我们正在查看项级别上的项,而在我们新尝试的自定义列上,intellisense建议父级上的项(这也是真实的运行时-因此它找不到属性)


PS:converter类可以在这里找到:

请展示一些代码,您已经做了什么?我尝试了各种方法,但老实说,到目前为止,我没有什么可以展示的,我知道至少是rightPost您的数据模型代码。也许还有一张你想要达到的目标的照片。如果我们不得不猜测的话,这是很难帮助我们的。PostedI还添加了一些xaml代码,说明我希望如何使用它。