Caliburn.Micro 将 DateTimeOffset 绑定到 DatePicker

Posted

技术标签:

【中文标题】Caliburn.Micro 将 DateTimeOffset 绑定到 DatePicker【英文标题】:Caliburn.Micro Binding DateTimeOffset to DatePicker 【发布时间】:2015-11-05 06:55:07 【问题描述】:

我需要将 DateTimeOffset 属性绑定到 WPF DatePicker,因为 Odata 不支持 DateTime。 我知道如何绑定DateTime 属性。

我尝试将DateTimeOffset 属性绑定到DatePicker,就像绑定DateTime 属性一样。

但价值根本没有改变。它始终具有默认值。

我该如何解决这个问题?

【问题讨论】:

使用DataTimeOffset.DateTime 属性转换为DateTime。正如您已经知道如何绑定它,可能比弄清楚如何绑定DateTimeOffset 更快。 感谢 Jack,保存记录时可以使用。但是我在检索记录时遇到了错误。 “TwoWay 或 OneWayToSource 绑定无法在“System.DateTimeOffset”类型的只读属性“DateTime”上工作。”。你有什么想法吗? 【参考方案1】:

尝试使用此值转换器。

public class DateTimeToDateTimeOffsetConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
            DateTimeOffset dto = (DateTimeOffset)value;
            return dto.DateTime;
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
            DateTime date = (DateTime)value;
            return new DateTimeOffset(date);
    

我基于此解决方案:http://bretstateham.com/binding-to-the-new-xaml-datepicker-and-timepicker-controls-to-the-same-datetime-value/

【讨论】:

这很好用,虽然名字倒了。它应该是 DateTimeOffsetToDateTimeConverter。 另外,为了处理空值,将第一行更改为 DateTimeOffset ? dto = (DateTimeOffset?) 值;并在转换回添加到开头 if (value == null) return null;【参考方案2】:

按照 Jack 的建议将其转换为 DateTime。为避免您在评论中描述的错误,请将 BindingMode 设置为 OneWay "Binding Path=MyProperty, Mode=OneWay"

【讨论】:

我同意,但添加绑定 Mode=OneWay 只会设置从数据源到 UI 元素的值。 UI Element (DatePicker) 中所做的更改不会反映在 DataSource 中,对吗?如何更改 DatePicker 中的日期并将其保存回 DB?以及如何添加空值?

以上是关于Caliburn.Micro 将 DateTimeOffset 绑定到 DatePicker的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ValueConverter 应用于基于约定的 Caliburn.Micro 绑定示例?

caliburn.micro 在 Release 目录中生成的文件

Caliburn.Micro 无法匹配来自不同程序集的 View 和 ViewModel

使用 WPF 和 Caliburn.Micro 在视图中添加多个视图

Caliburn.Micro框架之Bindings

MVVM框架 -- Caliburn.Micro 系列文章