如何在 Xceed PropertyGrid 中使用日期选择器?
How to use Date Picker in Xceed PropertyGrid?
我们正在使用扩展 WPF 工具包来实现 PropertyGrid
。
默认的日期选择控件似乎不是 WPF DatePicker
,而是一个自定义控件,如果我没记错的话。
通常,我们使用 DatePicker
控件来 select 日期。是否也可以将它们用于 PropertyGrid
控件?我们需要它来提供一致的 dd.MM.yyyy
日期格式,并且由于此 属性 是日期,因此也不应显示时间。
这可以使用 Xceed 属性 Grid 完成吗?
[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
public DateTime? Date { get; set; }
您的要求并不难实现:Xceed PropertyGrid
是高度可定制的,并且可以使用 ITypeEditor interface and the Editor 属性定制 属性 编辑器。
首先我们需要定义一个自定义编辑器控件:
public class DateTimePickerEditor : DateTimePicker, ITypeEditor
{
public DateTimePickerEditor()
{
Format = DateTimeFormat.Custom;
FormatString = "dd.MM.yyyy";
TimePickerVisibility = System.Windows.Visibility.Collapsed;
ShowButtonSpinner = false;
AutoCloseCalendar = true;
}
public FrameworkElement ResolveEditor(PropertyItem propertyItem)
{
Binding binding = new Binding("Value");
binding.Source = propertyItem;
binding.Mode = propertyItem.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay;
BindingOperations.SetBinding(this, ValueProperty, binding);
return this;
}
}
构造函数中的所有内容都是为了获得特定行为(即没有时间控制、特定日期格式等)。
现在我们需要将 DateTimePickerEditor
设置为对象 属性 的默认编辑器(在我们的示例中称为 "Date"):
[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
[Editor(typeof(DateTimePickerEditor), typeof(DateTimePicker))]
public Nullable<DateTime> Date
希望对您有所帮助。
您还可以使用 XAML 中显示的编辑器模板解决方案:"Custom Editors with DataTemplates":
https://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&referringTitle=Home
使用这种方法,您不会使模型 类 与外部库的属性混淆。
您可以通过以下方式实现日期时间类型的格式化输入:
<xctk:PropertyGrid>
<xctk:PropertyGrid.EditorDefinitions>
<xctk:EditorTemplateDefinition>
<xctk:EditorTemplateDefinition.TargetProperties>
<xctk:TargetPropertyType Type="{x:Type sys:DateTime}" />
</xctk:EditorTemplateDefinition.TargetProperties>
<xctk:EditorTemplateDefinition.EditingTemplate>
<DataTemplate>
<xctk:DateTimePicker Value="{Binding Value}" Format="ShortDate" />
</DataTemplate>
</xctk:EditorTemplateDefinition.EditingTemplate>
</xctk:EditorTemplateDefinition>
</xctk:PropertyGrid.EditorDefitions>
</xctk:PropertyGrid>
定义了命名空间 sys xmlns:sys="clr-namespace:System;assembly=mscorlib"
我们正在使用扩展 WPF 工具包来实现 PropertyGrid
。
默认的日期选择控件似乎不是 WPF DatePicker
,而是一个自定义控件,如果我没记错的话。
通常,我们使用 DatePicker
控件来 select 日期。是否也可以将它们用于 PropertyGrid
控件?我们需要它来提供一致的 dd.MM.yyyy
日期格式,并且由于此 属性 是日期,因此也不应显示时间。
这可以使用 Xceed 属性 Grid 完成吗?
[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
public DateTime? Date { get; set; }
您的要求并不难实现:Xceed PropertyGrid
是高度可定制的,并且可以使用 ITypeEditor interface and the Editor 属性定制 属性 编辑器。
首先我们需要定义一个自定义编辑器控件:
public class DateTimePickerEditor : DateTimePicker, ITypeEditor
{
public DateTimePickerEditor()
{
Format = DateTimeFormat.Custom;
FormatString = "dd.MM.yyyy";
TimePickerVisibility = System.Windows.Visibility.Collapsed;
ShowButtonSpinner = false;
AutoCloseCalendar = true;
}
public FrameworkElement ResolveEditor(PropertyItem propertyItem)
{
Binding binding = new Binding("Value");
binding.Source = propertyItem;
binding.Mode = propertyItem.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay;
BindingOperations.SetBinding(this, ValueProperty, binding);
return this;
}
}
构造函数中的所有内容都是为了获得特定行为(即没有时间控制、特定日期格式等)。
现在我们需要将 DateTimePickerEditor
设置为对象 属性 的默认编辑器(在我们的示例中称为 "Date"):
[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
[Editor(typeof(DateTimePickerEditor), typeof(DateTimePicker))]
public Nullable<DateTime> Date
希望对您有所帮助。
您还可以使用 XAML 中显示的编辑器模板解决方案:"Custom Editors with DataTemplates":
https://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&referringTitle=Home
使用这种方法,您不会使模型 类 与外部库的属性混淆。
您可以通过以下方式实现日期时间类型的格式化输入:
<xctk:PropertyGrid>
<xctk:PropertyGrid.EditorDefinitions>
<xctk:EditorTemplateDefinition>
<xctk:EditorTemplateDefinition.TargetProperties>
<xctk:TargetPropertyType Type="{x:Type sys:DateTime}" />
</xctk:EditorTemplateDefinition.TargetProperties>
<xctk:EditorTemplateDefinition.EditingTemplate>
<DataTemplate>
<xctk:DateTimePicker Value="{Binding Value}" Format="ShortDate" />
</DataTemplate>
</xctk:EditorTemplateDefinition.EditingTemplate>
</xctk:EditorTemplateDefinition>
</xctk:PropertyGrid.EditorDefitions>
</xctk:PropertyGrid>
定义了命名空间 sys xmlns:sys="clr-namespace:System;assembly=mscorlib"