UWP:DependencyProperty propertyChangedCallback设置为null时不触发

时间:2016-05-23 20:29:16

标签: c# wpf properties uwp

标题说明了一切......

我的DependencyProperty的代码如下:

public object IsChecked
{
    get { return GetValue(IsCheckedProperty); }
    set { SetValue(IsCheckedProperty, value); }
}
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(object),
                                                              typeof(MyCheckbox), 
                                                              new PropertyMetadata(false, IsCheckedChanged));

private static void IsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var checkbox = d as MyCheckbox;
    bool? newvalue = null;
    if (e.NewValue is bool?)
        newvalue = (bool?)e.NewValue;
    else if (e.NewValue != null)
    {
        bool newbool;
        if (!bool.TryParse(e.NewValue.ToString(), out newbool))
            return;
        newvalue = newbool;
    }
    if (checkbox != null && !checkbox.Checked.Equals(newvalue))
        checkbox.Checked = newvalue;
}

我像这样绑定到那个属性:

<local:MyCheckbox IsChecked="{Binding Stata,UpdateSourceTrigger=PropertyChanged}" />

Stata的实施方式如下:

private bool? _stata = null;
public bool? Stata
{
    get { return _stata; }
    set
    {
        _stata = value;
        OnPropertyChanged();
    }
}

当Stata更改为“true”时,MyCheckbox会按预期更新。但是,当Stata以null开头或更改为null时,MyCheckbox不会获得更新,IsCheckedChanged不会触发。

如果我将my属性的默认值更改为null,则为:

public static readonly DependencyProperty IsCheckedProperty =
    DependencyProperty.Register("IsChecked",
        typeof(object),
        typeof(MyCheckbox),
        new PropertyMetadata(null, IsCheckedChanged));

它再次按预期工作,只要IsCheckedChanged更改为Stata / truefalse,就会调用null

这是一个错误吗?我希望我的默认值为false,而不是null,我怎么能意识到这一点?

编辑:我已将示例解决方案上传到GitHub,而现在调用Changed函数,当值为null时,UWP的显示结果不同 您可以在此处找到存储库:https://github.com/ManIkWeet/DependencyPropertyTest

1 个答案:

答案 0 :(得分:1)

单击复选框时,该值将变为本地值,并且绑定将丢失。您可以使用命令更新您的状态。关于如何做到这一点有很多文章。

调试时你可能已经发现了两件事。 1)堆栈是不同的,我也注意到2)输出窗口中的错误:转换器无法将类型'Windows.Foundation.Boolean'的值转换为类型'IReference`1'现在正在搜索这个我发现:{{3根本原因似乎是基于com的,不支持nullables。