WPF DataGrid自定义列(不是templateColumn)

时间:2017-01-17 08:11:56

标签: c# wpf datagrid

有没有人有一个如何创建自定义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

0 个答案:

没有答案