如何在 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"