【问题标题】:How to use Date Picker in Xceed PropertyGrid?如何在 Xceed PropertyGrid 中使用日期选择器?
【发布时间】:2016-09-09 11:46:40
【问题描述】:

我们正在使用扩展 WPF 工具包来实现 PropertyGrid

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

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

这可以使用 Xceed 属性网格来完成吗?

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

【问题讨论】:

  • 对不起,我不明白:你想同时使用DatePicker 自定义默认控件,还是只使用DatePicker(而不是自定义默认控制)?
  • 我不确定控制是如何实现的。但最后,我需要的是PropertyGrid 的日期字段是没有时间的日期和dd.MM.yyyy 作为格式。就像 DatePicker 控件一样。如果 Xceed 使用自定义控件是次要的,只要它的格式正确。

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


【解决方案1】:

您的要求并不难实现: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 设置为对象属性的默认编辑器(在我们的示例中称为“日期”):

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

希望对你有帮助。

【讨论】:

  • 感谢您的回复,维克。我会在星期一回来工作时试试这个:)
  • 如果我们无法访问该属性怎么办?有没有办法将编辑器动态分配给给定的属性?
  • 在这种情况下@brianestey 您可以考虑使用EditorTemplateDefinition。您可以找到一些示例here
  • 这给我带来了一个错误,日期选择器在选择日期后恢复为默认值。发生这种情况是因为我在 dates 属性设置器中设置了两次日期,导致属性更改被触发两次。如果没有您的代码或者我没有设置两次日期,我不会得到这个。我有办法解决这个问题,但它肯定应该能够快速连续处理多个属性更改事件。
  • 仅通过评论很难理解您的错误@D.Hunt。也许你可以问一个新问题。这取决于您的问题。
【解决方案2】:

您还可以使用“带有 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"

【讨论】:

  • 这不适用于 DateTime? (即可为空的日期时间)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多