WPF DataGrid:带有 UserControl 和 TextBlock 的 TemplateColumn

WPF DataGrid : TemplateColumn with UserControl and TextBlock

我有点卡在这里..已经搜索了两天,没有找到解决方案。

我想要实现的是 DataGridComboBoxColumn 的行为。 我需要它的 DisplayMemberPathSelectedValuePathSelectedValueBinding 属性..

我的 UserControl 类似于 CellEditingTemplate 中的 ComboBox 和 CellTemplate.

中的 TextBlock

我在代码中做所有这些,因为这些列可能不一定存在..

这是我定义 TemplateColumn 的地方:

DataGridTemplateColumn tcol = new DataGridTemplateColumn();
tcol.Header = "accCust";

FrameworkElementFactory texttablF = new FrameworkElementFactory(typeof(TextTableBox));
texttablF.SetValue(TextTableBox.TableSourceProperty, accTable.DefaultView);

FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
texttablF.SetBinding(TextBlock.TextProperty, new Binding("Account"));


tcol.CellTemplate = new DataTemplate(typeof(DataGridCell)) { VisualTree = tb };
tcol.CellEditingTemplate = new DataTemplate(typeof(DataGridCell)) { VisualTree = texttablF };

我有两个问题:

  1. TextBlock 显示 DataGrid Table 中的 ID,我希望它显示 DisplayMemberPath 中指定的值,我不知道如何实现。
  2. DependencyProperty TableSource 在通过 FrameworkElement.setValue 完成时不工作。以正常方式完成时它工作, 即

    TextTableBox ttb = new TextTableBox();
    ttb.TableSource = src_table.DefaultView;
    

我希望你清楚我的问题是什么。我真正想要的是用我的 UserControl 替换 DataGridComboColumn 中的 ComboBox。

提前致谢:) 如果这是一个糟糕的问题,我很抱歉..我是 WPF 的新手并且正在上高中..

因为我想要 ComboBox 的属性,所以我不得不继承自 DataGridComboBoxColumn

代码如下所示:

public class DataGridTCBColumn : DataGridComboBoxColumn
{
    private TableComboBox comboBox;

    public DataGridTCBColumn(bool Editable)
    {
        comboBox = new TableComboBox() { IsEditable = Editable };
    }

    // Requires extra field..
    public string SelectedValuePathX
    {
        get
        {
            return (string)this.GetValue(SelectedValuePathXProperty);
        }
        set
        {

            this.SetValue(SelectedValuePathXProperty, value);

        }
    }
    static FrameworkPropertyMetadata SelectedValuePathXPropertyMeta = new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(SelectedValuePathXPropertyChanged));
    public static readonly DependencyProperty SelectedValuePathXProperty =
DependencyProperty.Register("SelectedValueX", typeof(string), typeof(TableComboBox), SelectedValuePathXPropertyMeta);
    private static void SelectedValuePathXPropertyChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
    {}

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        if (e.Property == DataGridTCBColumn.ItemsSourceProperty)
        {
            comboBox.ItemsSource = ItemsSource;
        }
        else if (e.Property == DataGridTCBColumn.SelectedValuePathProperty)
        {
            comboBox.SelectedValuePath = SelectedValuePath;
        }
        else if (e.Property == DataGridTCBColumn.DisplayMemberPathProperty)
        {
            comboBox.DisplayMemberPath = DisplayMemberPath;
        }

        base.OnPropertyChanged(e);
    }


    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        return comboBox;
    }
    protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
    {
        DataGridCell cell = editingEventArgs.Source as DataGridCell;
        if (cell != null && !string.IsNullOrEmpty(this.SelectedValuePathX))
        {
            //For Typed DataSet
            object obj = ((DataRowView)editingElement.DataContext).Row[this.SelectedValuePathX];
            comboBox.SelectedValue = obj;
        }

        comboBox.Focus();
        return comboBox.SelectedItem;
    }
    protected override bool CommitCellEdit(FrameworkElement editingElement)
    {   
        if (!string.IsNullOrEmpty(this.SelectedValuePathX) && comboBox.SelectedValue != null)
        ((DataRowView)editingElement.DataContext).Row[this.SelectedValuePathX] = comboBox.SelectedValue;
        return true;
    }
}

不得不创建另一个依赖属性 SelectedValuePathX。实际上,它完成了 SelectedValueBinding 的工作。然而,Binding 从来没有起作用(尝试通过 ComboBox 的源代码(Microsoft Reference Source),但也没有成功。

希望对大家有所帮助:)