2012-08-12 44 views
0

我想出了WPF中的綁定,並遇到與對象綁定的問題。如何在設置對象時維護綁定?

我有一個組合框設置爲用戶

ICollection<User> users = User.GetAll(); 
cmbContacts.ItemsSource = users;  

我也有我的UI對象持有所選用戶的列表中的ItemSource。

public partial class MainWindow : Window 
{ 

    private User selectedUser = new User(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     ReloadContents(); 

     Binding b = new Binding(); 
     b.Source = selectedUser; 
     b.Path = new PropertyPath("uFirstName"); 
     this.txtFirstName.SetBinding(TextBox.TextProperty, b); 
    } 

在我的組合框的SelectChanged方法...

selectedUser = (User)e.AddedItems[0]; 

然而,文本框沒有更新!我可以確認我通過移動綁定代碼的組合框結合工程SelectChanged方法

selectedUser = (User)e.AddedItems[0];  
Binding b = new Binding(); 
b.Source = selectedUser; 
b.Path = new PropertyPath("uFirstName"); 
this.txtFirstName.SetBinding(TextBox.TextProperty, b); 

現在的文本框更新的罰款。這似乎是不正確的做事方式。任何人都可以將我指向正確的方向嗎?

回答

0

在您的代碼中,我看到一個錯誤 - 當您設置字段selectedUser時,您不會通知該數據已更改。你的樣品必須是這樣的:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private User selectedUser; 

    public User SelectedUser 
    { 
     get 
     { 
      return selectedUser; 
     } 
     set 
     { 
      selectedUser = value; 
      NotifyPropertyChanged("SelectedUser"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     ReloadContents(); 

     // Now the source is the current object (Window), which implements 
     // INotifyPropertyChanged and can tell to WPF infrastracture when 
     // SelectedUser property will change value 
     Binding b = new Binding(); 
     b.Source = this; 
     b.Path = new PropertyPath("SelectedUser.uFirstName"); 
     this.txtFirstName.SetBinding(TextBox.TextProperty, b); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

而且不要忘了,現在你需要將新的值設置爲屬性,不使用領域,所以SelectChanged應該是這樣的:

SelectedUser = (User)e.AddedItems[0]; 
+0

,並且請看看MVVM模式 - 最好是單獨使用View和ViewModel。 – outcoldman 2012-08-12 19:03:29

+0

工作很好!我的用戶類中確實有INotifyPropertyChanged,但由於某種原因,它沒有觸發。 – 2012-08-13 18:03:00