C# 如何在WPF中设置自定义DataGridBind列的值
因为无法将值粘贴到DataGridTemplateColumn中。我发现了一些关于创建自己的从DataGridBoundColumn派生的column类的建议。下面的示例在不使用模板的情况下向列添加日期选择器 但是,这个示例不允许我使用DatePicker手动设置值,我不知道为什么。我在想是装订有问题。它将加载我最初绑定到它的日期值,这样它就完成了一半 有趣的是,使用其他一些助手类,我也可以粘贴日期,这正是最初的目的。我只是不想破坏任何东西。:-) 有没有办法让datepicker选择的值正确绑定C# 如何在WPF中设置自定义DataGridBind列的值,c#,.net,wpf,datagrid,datepicker,C#,.net,Wpf,Datagrid,Datepicker,因为无法将值粘贴到DataGridTemplateColumn中。我发现了一些关于创建自己的从DataGridBoundColumn派生的column类的建议。下面的示例在不使用模板的情况下向列添加日期选择器 但是,这个示例不允许我使用DatePicker手动设置值,我不知道为什么。我在想是装订有问题。它将加载我最初绑定到它的日期值,这样它就完成了一半 有趣的是,使用其他一些助手类,我也可以粘贴日期,这正是最初的目的。我只是不想破坏任何东西。:-) 有没有办法让datepicker选择的值正确绑
class MyDateColumn : DataGridBoundColumn
{
public string DateFormat { get; set; }
protected override void CancelCellEdit(FrameworkElement editingElement, object uneditedValue)
{
DatePicker dp = editingElement as DatePicker;
if (dp != null)
{
dp.SelectedDate = DateTime.Parse(uneditedValue.ToString());
}
}
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
DatePicker dp = new DatePicker();
Binding b = new Binding();
Binding bb = this.Binding as Binding;
b.Path = bb.Path;
b.Source = DatePicker.SelectedDateProperty;
if (DateFormat != null)
{
DateTimeConverter dtc = new DateTimeConverter();
b.Converter = dtc;
b.ConverterParameter = DateFormat;
}
dp.SetBinding(DatePicker.SelectedDateProperty, this.Binding);
return dp;
}
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
TextBlock txt = new TextBlock();
Binding b = new Binding();
Binding bb = this.Binding as Binding;
b.Path = bb.Path;
b.Source = cell.DataContext;
if (DateFormat != null)
{
DateTimeConverter dtc = new DateTimeConverter();
b.Converter = dtc;
b.ConverterParameter = DateFormat;
}
txt.SetBinding(TextBlock.TextProperty, this.Binding);
return txt;
}
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
DatePicker dp = editingElement as DatePicker;
if (dp != null)
{
DateTime? dt = dp.SelectedDate;
if (dt.HasValue)
return dt.Value;
}
return DateTime.Today;
}
protected override bool CommitCellEdit(FrameworkElement editingElement)
{
DatePicker dp = editingElement as DatePicker;
dp.SelectedDate = DateTime.Today.AddYears(1);
return true;
//return base.CommitCellEdit(editingElement);
}
}
解决方案是对CommitCellEdit()的修改 原始代码和帮助来自以下链接
感谢创建示例和帮助Lee 我找到了一种更简单、更通用的解决方法。我没有为每个模板列创建自定义列,而是创建了一个从DataGridTemplateColumn继承的自定义列。这将解决您想要拥有的所有模板的问题。自定义列具有其他BindingPath属性,您可以在其中指定要使用粘贴的数据更新绑定对象上的哪个属性。显然,绑定对象需要实现INotifyPropertyChanged接口。更新源后,控件将自动更新 以下是自定义列代码:
using System.Reflection;
using Microsoft.Windows.Controls;
namespace Bartosz.Wojtowicz.Wpf
{
public class PastableDataGridTemplateColumn : DataGridTemplateColumn
{
public string BindingPath { get; set; }
public override void OnPastingCellClipboardContent(object item, object cellContent)
{
if (item != null)
{
PropertyInfo propertyInfo = item.GetType().GetProperty(BindingPath);
if (propertyInfo != null)
{
propertyInfo.SetValue(item, cellContent, null);
}
}
}
}
}
下面是如何在xaml中使用它:
<local:PastableDataGridTemplateColumn Header="Value" BindingPath="ValueView" ClipboardContentBinding="{Binding ValueView}" >
<local:PastableDataGridTemplateColumn.CellTemplate >
<DataTemplate>
<!-- your template ... -->
</DataTemplate>
</local:PastableDataGridTemplateColumn.CellTemplate>
<local:PastableDataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!-- your template ... -->
</DataTemplate>
</local:PastableDataGridTemplateColumn.CellEditingTemplate>
</local:PastableDataGridTemplateColumn>
<local:PastableDataGridTemplateColumn Header="Value" BindingPath="ValueView" ClipboardContentBinding="{Binding ValueView}" >
<local:PastableDataGridTemplateColumn.CellTemplate >
<DataTemplate>
<!-- your template ... -->
</DataTemplate>
</local:PastableDataGridTemplateColumn.CellTemplate>
<local:PastableDataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!-- your template ... -->
</DataTemplate>
</local:PastableDataGridTemplateColumn.CellEditingTemplate>
</local:PastableDataGridTemplateColumn>