如何在Xceed PropertyGrid中使用日期选择器?

时间:2016-09-09 11:46:41

标签: c# wpf propertygrid xceed wpf-extended-toolkit

我们正在使用Extended WPF Toolkit来实现PropertyGrid

默认日期选择控件似乎不是WPF DatePicker,而是自定义控件,如果我没记错的话。

通常,我们使用DatePicker控件来选择日期。对于PropertyGrid控制,是否也可以使用它们?我们需要这样才能提供dd.MM.yyyy的一致日期格式,因为此属性是日期,所以也不应显示时间。

可以使用Xceed Property Grid完成吗?

[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
public DateTime? Date { get; set; }

datepicker

2 个答案:

答案 0 :(得分:2)

您要求的内容并非难以实现:Xceed PropertyGrid可自定义,并且可以使用ITypeEditor界面和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设置为object属性的默认编辑器(在我们的示例中称为" Date"):

[Category("General")]
[DisplayName("Date")]
[PropertyOrder(2)]
[Editor(typeof(DateTimePickerEditor), typeof(DateTimePicker))]
public Nullable<DateTime> Date

我希望它有所帮助。

答案 1 :(得分:0)

您还可以使用“使用DataTemplates自定义编辑器”中显示的编辑器模板来使用仅限XAML的解决方案:

https://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid&referringTitle=Home

使用这种方法,您不会使用外部库的属性来混淆模型类。

您可以通过以下方式实现DateTime类型的格式化输入:

<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"