在ViewModel中将属性设置为null?

时间:2016-08-05 22:43:59

标签: c# wpf xaml

我有一个Telerik RadDataForm,其中包含几个绑定到可空属性的DataFormDataField:

<telerik:DataFormDataField Label="My Property">
    <telerik:RadNumericUpDown Value="{Binding Path=MyProperty}" />
</telerik:DataFormDataField>

private double? myProperty;
public double? MyProperty
{
    get { return this.myProperty; }
    set
    {
        this.myProperty = value;
        this.onPropertyChanged(nameof(this.MyProperty));
    }
}

public event PropertyChangedEventHandler PropertyChanged;

private void onPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

当表单加载时,属性为null,因此控件为空。如果用户键入或使用控件将数字放入属性,控件将显示该值,并将属性设置为正确的值。

我需要能够在代码中将属性重置为null并再次清除控件。不幸的是,当我将属性设置为null时,控件不会更改并继续包含先前的值。

有关如何实现这一目标的任何想法?

=== ADDENDUM ===

为了澄清这是Telerik的RadNumericUpDown控件或基本WPF绑定中的问题,我将其替换为来自Alex Titarenko WPFControls的IntegerUpDown:

<telerik:DataFormDataField>
    <xctk:IntegerUpDown Value="{KtWpf:IntegerBinding Path=mileageend}" />
</telerik:DataFormDataField>

我看到了完全相同的行为。

=== OOPS ===

好的,问题与绑定无关。隐藏在支持包含此数据表单的控件的视图模型的代码中,我们新建了绑定数据表单的对象。

发生的事情是,在我们开始将这些字段设置为new的代码之前,我们新建了一个新对象并指向视图模型对它的引用。因此,当我在调试器中浏览时,我正在查看一个对象,并将其字段设置为null,但数据表单仍然绑定到原始文件,但未更改。

当我将数据表单实际绑定的对象的字段置空时,一切正常。

对不起,大家,为了分心,感谢您的帮助。

一点建议 - 当发生的事情似乎毫无意义时,可能发生的事情并非你认为的情况。

1 个答案:

答案 0 :(得分:1)

变量和属性都必须是可为空的

private double? myProperty;
public double? MyProperty
{
    get { return this.myProperty; }
    set
    {
        this.myProperty = value;
        this.onPropertyChanged(nameof(this.MyProperty));
    }
}

可空属性的问题在于,当您将值放入另一个双精度时,您必须强制转换它们

double d = (double)MyProperty;

修改

要检查某个对象或DependencyProperty是否nullable,请参阅this question