2013-04-12 167 views
1

我想使用MVVM模式的數據網格工作。問題是當我第一次在datagrid中選擇一個項目時,datagrid會正確更新source屬性,然後我選擇另一個項目,source屬性不會更新。提前WPF Datagrid selectedItem不更新源

public Customer SelectedCustomer 
{ 
    get { return _selectedCustomer; } 
    set 
    { 
     if (value != _selectedCustomer) 
     { 
      _selectedCustomer = value; 
      NotifyOfPropertyChange(() => SelectedCustomer); 
     } 
    } 
} 

感謝:這是我在XAML綁定:

<DataGrid ItemsSource="{Binding Customers}" 
      SelectedItem="{Binding SelectedCustomer, Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"> 

視圖模型代碼!

+0

您確定您在'SelectedCustomer'中設置的'Customer'是'Customers'子項之一。注意'SelectedCustomer'必須與'客戶'子女不是同一個客戶的同一個引用。 (相同的參考不是客戶),這是非常重要的。 – MoHaKa

+0

@MoHaKa感謝您的評論。我確定他們是參考同一個客戶。 –

+0

第一次選擇後,您在輸出窗口中是否有任何綁定錯誤?只是要說清楚你說的是SelectedCustomer在第一次選擇後沒有更新,對嗎?它看起來像你可能會使用CaliburnMicro你有沒有試過設置x:Name =「Customers」,看看CM是否可以爲你處理綁定? –

回答

2

我已經解決了這個問題,原因是客戶的Equals方法存在拼寫錯誤。

1

看來你的實現可能會稍微偏離。通常,在屬性發生更改後,實現ModelView以實現更改的「INotifyPropertyChanged」。您綁定到一個觀察集合通常你有類似的成員列表你有什麼,但我一般不喜歡它:

public string Email 
     { 
      get { return _customer.Email; } 
      set 
      { 
       if (value == _customer.Email) 
        return; 

       _customer.Email = value; 

       OnPropertyChanged("Email"); // Text should match property name 
      } 
     } 

在這個例子中_customer將是一個POCO對象的私有成員是有它的自己設置的屬性。您通常綁定到父集合作爲數據源,然後在其成員上實現屬性。我從主MVVM MSDN的例子中獲得了這個參考:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

我也不確定,但一旦我通常綁定數據Itemssource = {Binding(ModelView中的collectionName)}我只列出了文本那個集合。 EG:selectitem =「email」,這是該集合的一個屬性。我也通常使用'可觀察集合'數據類型,因爲這將實現這些更改。由於這個原因,我不確定MVVM中是否使用了列表和其他集合。我知道'readonlycollection'和'observablecollection'是最常見的。

+0

謝謝。在我的情況下,SelectedItem是Customer對象而不是它的屬性。 –