C# SetValue不更新UI,但OnPropertyChanged会更新UI

C# SetValue不更新UI,但OnPropertyChanged会更新UI,c#,mvvm,microsoft-metro,windows-runtime,C#,Mvvm,Microsoft Metro,Windows Runtime,我有一个双向绑定,可以控制滑块的值: <Slider Orientation="Vertical" Height="200" Value="{Binding Path=MapScale, Mode=TwoWay}" Maximum="{Binding MaxScale}" Minimum="{Binding MinScale}" StepFrequency="0.1" /> 正如代码现在所示,当我更新MapScale时,滑块会正确更新,例如MapScale+=.1。但是,如果我删除

我有一个双向绑定,可以控制滑块的值:

<Slider Orientation="Vertical" Height="200" Value="{Binding Path=MapScale, Mode=TwoWay}" Maximum="{Binding MaxScale}" Minimum="{Binding MinScale}" StepFrequency="0.1" />
正如代码现在所示,当我更新MapScale时,滑块会正确更新,例如MapScale+=.1。但是,如果我删除了OnPropertyChanged方法(我在SetValue调用的印象下),滑块将无法正确更新

我错过了什么

Slider.Value的类型为double,不可为null。我注意到WinRT对匹配绑定类型非常挑剔。它不会自动转换像WPF和Silverlight这样的大多数东西

我的答案是:

使用INotifyPropertyChanged as@Adi,并使用double作为属性类型

如果无法在视图模型中使用Nullable,请创建一个将null转换为零的IValueConverter

Slider.Value的类型为double,不可为null。我注意到WinRT对匹配绑定类型非常挑剔。它不会自动转换像WPF和Silverlight这样的大多数东西

我的答案是:

使用INotifyPropertyChanged as@Adi,并使用double作为属性类型


如果无法在视图模型中使用Nullable,请创建一个将null转换为零的IValueConverter

使用依赖项属性而不是常规属性有什么原因吗?我不认为我见过在viewmodel中使用DPs的例子,当谈到viewmodels时,我自己也总是使用普通的旧属性。DPs似乎是Metro应用程序的发展方向。对于普通的旧属性,您使用了OnPropertyChanged还是其他什么?是的,INotifyPropertyChanged。使用依赖属性而不是常规属性有什么原因吗?我不认为我见过在viewmodel中使用DPs的例子,当谈到viewmodels时,我自己也总是使用普通的旧属性。DPs似乎是Metro应用程序的发展方向。对于普通的旧属性,您使用了OnPropertyChanged还是其他什么?是的,INotifyPropertyChanged。
    public static readonly DependencyProperty MapScaleProperty =
         DependencyProperty.Register("MapScale", typeof(Double?), typeof(MappingPageViewModel), new PropertyMetadata(0.0));

    public Double? MapScale
    {
        get { return GetValue(MapScaleProperty) as Double?; }
        set { SetValue(MapScaleProperty, value); OnPropertyChanged("MapScale"); }
    }