Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF C#应用程序中使用Xceed DateTimePicker时,为什么使用单向绑定时该值只更新一次?_C#_Wpf_Datetimepicker_Xceed - Fatal编程技术网

在WPF C#应用程序中使用Xceed DateTimePicker时,为什么使用单向绑定时该值只更新一次?

在WPF C#应用程序中使用Xceed DateTimePicker时,为什么使用单向绑定时该值只更新一次?,c#,wpf,datetimepicker,xceed,C#,Wpf,Datetimepicker,Xceed,如果我尝试使用XceedDateTimePicker控件(当前为v4.0.1)并使用单向绑定到视图模型上的属性,我会发现控件中的值只更新一次(在初始值之后第一次更改)但是对视图模型属性的任何后续更改都不会导致DateTimePicker值更新(至少在视觉上) 需要明确的是,绑定似乎至少工作了两次:初始值是从视图模型正确设置的,第一次更新视图模型属性时,更新的值会正确显示在控件中。但是,属性的所有后续更新都不会对控件的值产生影响:就像第一次更改后它被“卡住”一样。为了查看我是否完全偏离了WPF绑定

如果我尝试使用Xceed
DateTimePicker
控件(当前为v4.0.1)并使用
单向
绑定到视图模型上的属性,我会发现控件中的值只更新一次(在初始值之后第一次更改)但是对视图模型属性的任何后续更改都不会导致
DateTimePicker
值更新(至少在视觉上)

需要明确的是,绑定似乎至少工作了两次:初始值是从视图模型正确设置的,第一次更新视图模型属性时,更新的值会正确显示在控件中。但是,属性的所有后续更新都不会对控件的值产生影响:就像第一次更改后它被“卡住”一样。为了查看我是否完全偏离了WPF绑定的预期,我还定义了一个普通的
文本框
,在绑定到视图模型上相同属性的XAML中的
日期时间选择器
旁边有一个
单向
绑定,并且它完全按照预期进行更新——不会卡住。似乎使用
单向
绑定可以像我预期的那样在那里工作

以下是相关XAML的一个片段:

<xctk:DateTimePicker
    x:Name="DateTakenPicker"
    Value="{Binding Path=DateTaken,Mode=OneWay}"
/>
<TextBox
    x:Name="DateBox"
    TextWrapping="WrapWithOverflow"
    Text="{Binding Path=DateTaken,Mode=OneWay}"
/>
每当代码更改
DateTake
属性时,
文本框中显示的值始终会更改为匹配,但
日期时间选择器中显示的日期仅显示最初的值,然后在第一次更改后显示。第二个到N个值仅会更改文本框中的值

我还验证了,如果我将
DateTimePicker
上的绑定更改为
two-way
,那么它的行为与预期的一样:也就是说,所有的更改总是正确地反映在
DateTimePicker
中,而不仅仅是第一次更改。但是为什么只有双向
绑定才会出现这种情况,而不是单向

同样要明确的是,我从来没有点击、输入甚至摆弄
DateTimePicker
控件,只会导致代码更改
datetake
值并观察对控件的影响


谢谢

尝试将
if(\u datetake!=value)
更改为
if(!Equals(\u datetake,value))
@MickyD我怀疑这会有任何区别,因为DateTime实现了(in)相等运算符
=
=@KlausGütter OK。对于备注中描述的情况,您的分析乍一看似乎是正确的,这可能是DateTimePicker中的错误。由于源代码在上可用,您可以调试此问题并在那里提交错误报告。@MickyD
Nullable
上的相等运算符是。如果我正确地阅读了所有内容,这相当于当任何(或两个)参数都为空时的
Equals
行为。尝试将
If(\u datetake!=value)
更改为
If(!Equals(\u datetake,value))
@MickyD我怀疑这是否会在DateTime实现(in)时产生任何影响相等运算符
==
=@KlausGütter OK。对于备注中描述的情况,您的分析乍一看似乎是正确的,这可能是DateTimePicker中的错误。由于源代码在上可用,您可以调试此问题并在那里提交错误报告。@MickyD
Nullable
上的相等运算符是。如果我正确地读取了所有内容,那么当任何(或两个)参数都为null时,这相当于
Equals
行为。
private DateTime? _dateTaken = null;
public DateTime? DateTaken
{
    get { return _dateTaken; }
    set
    {
        if (_dateTaken != value)
        {
            _dateTaken = value;
            NotifyPropertyChanged();
        }
    }
}
...
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}