WP8.1 DatePicker绑定 - 值永远不会更新

时间:2015-06-22 14:58:10

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

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,但它无法正常工作。

有没有人有解决方案?

2 个答案:

答案 0 :(得分:0)

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

OnPropertyChanged("");

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

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

在这种情况下,只有在方法调用中使用OMIT参数时,才会为propertyName提供

根据the reference docs at MSDN

  

“来电者信息”属性不会使参数成为可选参数。相反,它们会影响在省略参数时传递的默认值

如果您将任何值传递给方法,它将覆盖CallerMemberNameAttribute指定的值。

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

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

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

答案 1 :(得分:0)

显然,DatePicker的OneWay绑定模式会被窃听,并且不会反映更改。你可以解决&#34;将绑定模式设置为TwoWay的问题。

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