2012-09-30 56 views
1

我正在構建Windows應用商店應用程序,並且我的TextBox綁定了(雙向模式)到我的TaskItem對象的字符串「title」屬性。在雙向綁定中通知目標更改源

我需要做一些處理之後在UI中對這個TextBox進行了更改並傳播回源。

我想知道是否有辦法檢測目標(TextBox的Text屬性)何時發生變化。我知道我可以通過處理TextBox的LostFocus事件來捕獲此事件,但是在更新源文件之前,此事件被觸發之前

更新:

綁定:

<ScrollViewer 
      x:Name="itemDetail" 
      DataContext="{Binding SelectedItem, ElementName=itemListView}"> 
    <TextBox x:Name="itemTitle" Text="{Binding Title, Mode=TwoWay}"/> 
</ScrollViewer> 

類和屬性:

class TaskItem 
{ 
    public string Title { get; set; } 
} 

我沒有實現INotifyPropertyChanged,因爲我其實並不需要改變傳播從源頭到目標。

我能想到的兩種解決方案:

  • 有沒有辦法使用[CallerMemberName]上的屬性的setter方法嗎?如果有的話,我可以確定「標題」是由我自己的代碼還是因爲綁定而改變。
  • 消失雙向綁定並在LostFocus事件期間手動更新源。
+0

顯示裝訂和財產。你是否實現了INotifyPropertyChange? –

+0

聽起來好像你需要將變化從目標傳播到源代碼。你說你不需要那個,但你的問題暗示你確實需要它。沒有?我錯過了什麼嗎?爲什麼不實施INotifyPropertyChange並完成它? –

+0

我的不好,我的意思是相反,我沒有實現它,因爲我不需要從源傳播到目標。現在編輯它。 – dcastro

回答

1
class TaskItem, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    internal void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string title; 
    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (title == value) return; 
      title = value; 
      NotifyPropertyChanged("Title"); 
     } 
    } 
    public TaskItem (string -title) 
    { title = _title; } 
    // does not fire setter title lower case 
    // but the UI will have this value as ctor fires before render 
    // so get will reference the assigned value of title 
} 

Constructor Design

+0

有兩個setter(一個用於公共使用,另一個用於綁定)有點過於hacky,但它有效。 – dcastro

+0

從技術上講,並不是兩個制定者。 title =標題;分配一個成員變量。這是MSDN網站上用於成員設計指南\構造器設計的模式。我不同意這是一個黑客攻擊。這是成員變量的一個目的。它不是完全按照你的意願去做的嗎? – Paparazzi

+0

這是否意味着我只能通過構造函數分配標題?如果我理解正確,界面將被綁定爲「標題」,而我的代碼將不得不使用'新的TaskItem(「hi」)' – dcastro