2013-04-12 3 views
1

Я пытаюсь работать с datagrid с использованием шаблона MVVM. Проблема в том, что я впервые выбираю элемент в datagrid, datagrid корректно обновляет исходное свойство, затем я выбираю другой элемент, свойство source не обновляется. Это мой привязки в XAML: КодWPF Datagrid selectedItem not update source

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

ViewModel:

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

Спасибо заранее!

+0

Вы уверены, что 'Customer', который вы устанавливаете в' SelectedCustomer', является одним из «детей клиентов». обратите внимание, что 'SelectedCustomer' должен быть одинаковым. Ссылка одного из« клиентов »не одного и того же клиента. (тот же справочник, а не клиент), это очень важно. – MoHaKa

+0

@MoHaKa Спасибо за ваш комментарий. Я уверен, что они ссылаются на одного и того же клиента. –

+0

Получены ли какие-либо ошибки привязки в окне вывода после первого выбора? И чтобы быть понятным, вы говорите, что SelectedCustomer не обновляется после первого выбора, правильно? Похоже, вы используете CaliburnMicro, попробовали ли вы просто установить x: Name = «Customers» и посмотреть, сможет ли CM обработать привязку для вас? –

ответ

2

Я решил проблему, потому что есть ошибка орфографии в методе Equals Customer.

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, который имеет это собственные свойства. Обычно вы привязываетесь к родительской коллекции как к источнику данных, а затем реализуете свойства на своих членах. Я получил это из основного примера MSVM MSDN для справки: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Я также не уверен, но как только я обычно связываю данные Itemssource = {Binding (collectionName в ModelView)} Я просто перечисляю текст memebers of это коллекция. EG: selectitem = "email", который является свойством коллекции. Я также обычно использую тип данных «наблюдаемая коллекция», так как это будет осуществлять изменения. Я не уверен, что списки и другие коллекции используются в MVVM по этой причине. Я знаю, что «readonlycollection» и «observablecollection» являются наиболее распространенными.

+0

Спасибо. В моем случае выбранным объектом является объект Customer, а не его свойство. –

Смежные вопросы