WPF DataGrid:带有 UserControl 和 TextBlock 的 TemplateColumn
WPF DataGrid : TemplateColumn with UserControl and TextBlock
我有点卡在这里..已经搜索了两天,没有找到解决方案。
我想要实现的是 DataGridComboBoxColumn
的行为。
我需要它的 DisplayMemberPath
、SelectedValuePath
和 SelectedValueBinding
属性..
我的 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 };
我有两个问题:
- TextBlock 显示 DataGrid Table 中的 ID,我希望它显示
DisplayMemberPath
中指定的值,我不知道如何实现。
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),但也没有成功。
希望对大家有所帮助:)
我有点卡在这里..已经搜索了两天,没有找到解决方案。
我想要实现的是 DataGridComboBoxColumn
的行为。
我需要它的 DisplayMemberPath
、SelectedValuePath
和 SelectedValueBinding
属性..
我的 UserControl 类似于 CellEditingTemplate
中的 ComboBox
和 CellTemplate
.
我在代码中做所有这些,因为这些列可能不一定存在..
这是我定义 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 };
我有两个问题:
- TextBlock 显示 DataGrid Table 中的 ID,我希望它显示
DisplayMemberPath
中指定的值,我不知道如何实现。 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),但也没有成功。
希望对大家有所帮助:)