2015-06-22 56 views
2

XAML代碼:(!視圖模型的靜態實例 - 只是一個測試)WP8.1 DatePicker的結合 - 值永遠不會被更新

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

DataContext設置App.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.ViewModel.DateTimeOffsetTest = new DateTimeOffset(new DateTime(1988, 09, 11));; 

問題是,DatePicker的行爲就像它曾經的結合。如果我更新ViewModel中的屬性,DatePicker將不會更新。我試着將模式設置爲OneWay並更改UpdateSourceTrigger,但它不起作用。

有沒有人有解決方案?

+0

如果一切正常,它應該工作。一切都不正確。您需要添加該屬性的代碼,以及如何從代碼更新它的示例。毫無疑問,你在那裏有一個錯誤。 – Will

+0

編輯過的信息包含所有需要的信息。感謝您的幫助@Will – Millkovac

+0

並且有了這些信息,我們有一個答案!一個簡單的修復,你會在你的路上。 – Will

回答

0

(注意,這個答案適用於問題的原碼)

OnPropertyChanged("");

呀,沒了。您正在向不存在的屬性提供一個名稱(無意義的 - 一個空字符串)。

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

在這種情況下,propertyName將提供僅如果忽略該方法調用的參數。

根據the reference docs at MSDN

來電顯示信息的屬性不作參數可選。相反,它們影響在省略參數時在中傳遞的默認值。

如果傳遞任何值入法,它將覆蓋CallerMemberNameAttribute -assigned值。

在你的財產setter方法,請執行下列操作:

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

該框架將提供呼叫者的名字的方法,因爲你沒有提供的。你的綁定現在可以工作。

+0

我的錯誤(我通常使用MvvmLight框架),但是,它仍然無法正常工作。我也嘗試提供屬性名稱 - OnPropertyChanged(「DateTimeOffsetTest」); – Millkovac

+0

@Millkovac如果這個調用是在你的代碼中,那是一個bug,這是修復。如果你沒有把別的東西搞砸,它一定會起作用。創建一個原型並看看。您的DatePicker上可能沒有預期的DataContext。你在我的答案編輯胡扯:/。 – Will

+0

它適用於WPF。我知道所有設置都正確,因爲DatePicker的值在初始綁定上正確設置,但是,任何更改都不會反映出來。 – Millkovac

0

顯然,DatePicker的OneWay綁定模式被竊聽,並且更改沒有反映出來。您可以通過將綁定模式設置爲TwoWay來「解決」問題。

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