【问题标题】:WP8.1 DatePicker binding - value never gets updatedWP8.1 DatePicker 绑定 - 值永远不会更新
【发布时间】:2015-09-08 02:23:28
【问题描述】:

XAML 代码:

<DatePicker Date="{Binding DateTimeOffsetTest}"></DatePicker>

DataContext 设置为 App.ViewModel(ViewModel 的静态实例 - 仅用于测试!)

视图模型:

public class ViewModel : INotifyPropertyChanged
    {
        private DateTimeOffset _dateTimeOffsetTest = new DateTimeOffset(new DateTime(1980, 10, 10));

        public DateTimeOffset DateTimeOffsetTest
        {
            get { return _dateTimeOffsetTest; }
            set
            {
                _dateTimeOffsetTest = value; 
                //Was OnPropertyChanged(""); (Thanks to Will for fix)
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

为了测试,我只是将 ViewModel 初始化为 App 中的静态实例。 我将此代码添加到按钮的单击事件处理程序中:

App.ViewModel.DateTimeOffsetTest = new DateTimeOffset(new DateTime(1988, 09, 11));;

问题是 DatePicker 的行为类似于它的 OneTime 绑定。如果我更新 ViewModel 中的属性,DatePicker 将不会更新。我尝试将模式设置为 OneWay 并更改 UpdateSourceTrigger,但它不起作用。

有人有解决办法吗?

【问题讨论】:

  • 如果一切正常,它应该可以工作。一切都不对。您需要添加属性的代码,以及如何从代码更新它的示例。毫无疑问,你那里有一个错误。
  • 已编辑帖子,包含所有请求的信息。感谢您的帮助@Will
  • 有了这些信息,我们就有了答案!一个简单的修复,你就可以上路了。
  • 我使用您的修复程序编辑了帖子以避免混淆(因为这不是主要问题)。

标签: c# windows-phone-8 binding datepicker


【解决方案1】:

(注意,此答案适用于问题的原始代码)

OnPropertyChanged("");

是的,不。您正在为不存在的属性提供名称(无意义的名称 - 一个空字符串)。

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

在这种情况下,propertyName 只有在您省略方法调用中的参数时才会提供

根据the reference docs at MSDN

调用者信息属性不会使参数成为可选参数。相反,它们会影响省略参数时传入的默认值。

如果您将 any 值传递给方法,它将覆盖 CallerMemberNameAttribute 分配的值。

在您的属性设置器中,执行以下操作:

public DateTimeOffset DateTimeOffsetTest
{
    get { return _dateTimeOffsetTest; }
    set
    {
        _dateTimeOffsetTest = value; 
        OnPropertyChanged();  // LOOK HERE
    }
}

框架将提供方法调用者的名称,因为您没有提供。您的绑定现在可以工作了。

【讨论】:

  • 我的错误(我通常使用 MvvmLight 框架),但是它仍然不起作用。我也尝试提供属性名称 - OnPropertyChanged("DateTimeOffsetTest");
  • @Millkovac 如果该调用在您的代码中,那是一个错误,这就是修复。如果您没有搞砸其他事情,那么它可以保证工作。创建一个原型并查看。您的 DatePicker 上可能没有预期的 DataContext。您的编辑对我的回答无效:/.
  • 它在 WPF 中工作。我知道一切都设置正确,因为 DatePicker 的值在初始绑定时设置正确,但是,任何更改都不会得到反映。
  • 除了明显的错误,我看不出有什么问题。我会告诉您在运行时使用 Snoop 检查绑定,但我认为这不适用于 WP 模拟器。如果有一个类似的工具可以在运行时检查控件状态,我会用它来查看 DatePicker 的 DataContext。也许默认的 UpdateSourceTrigger 或类似的不是您所期望的?
【解决方案2】:

显然,DatePicker 的 OneWay 绑定模式存在错误,并且没有反映更改。您可以通过将绑定模式设置为 TwoWay 来“解决”问题。

<DatePicker Date="{Binding DateTimeOffsetTest, Mode=TwoWay}">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多