【问题标题】:SetValue doesn't update UI but OnPropertyChanged doesSetValue 不会更新 UI,但 OnPropertyChanged 会
【发布时间】:2012-10-08 01:11:46
【问题描述】:

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

<Slider Orientation="Vertical" Height="200" Value="{Binding Path=MapScale, Mode=TwoWay}" Maximum="{Binding MaxScale}" Minimum="{Binding MinScale}" StepFrequency="0.1" />

绑定在 ViewModel 中作为 DependencyProperty:

    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"); }
    }

就像现在的代码一样,当我更新 MapScale(例如MapScale += .1)时,滑块会正确更新。但是,如果我删除 OnPropertyChanged 方法(我的印象是 SetValue 已经调用过),滑块不会正确更新。

我错过了什么?

【问题讨论】:

  • 您是否有理由使用依赖属性而不是常规属性?我认为我没有看到在视图模型中使用 DP 的示例,而在视图模型方面,我自己一直使用普通的旧属性。
  • DPs 似乎是 Metro 应用程序的必经之路。对于普通的旧属性,您是否使用了 OnPropertyChanged 或其他东西?
  • 是的,INotifyPropertyChanged

标签: c# mvvm microsoft-metro windows-runtime


【解决方案1】:

Slider.Value 的类型为 double,而不是 Nullable&lt;double&gt;。我注意到 WinRT 对匹配绑定类型非常挑剔。它不会像 WPF 和 Silverlight 那样为您自动转换大多数东西。

我的回答是:

使用INotifyPropertyChanged 作为已经提到的@Adi 并使用double 作为属性类型。

如果您在视图模型中无法使用Nullable&lt;double&gt;,请创建一个IValueConverter,将null 转换为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多