2015-02-26 5 views
2

Я пытаюсь связать GridView с помощью BindingList<T> в шаблоне MVVM.Winforms MVVM GridView DataBinding

В моем коде, я связать GridView следующим образом:

BindingSource bindingSource = new BindingSource(Context.MyList, null); 
bindingSource.CurrentChanged += Context.BindingSourceCurrentItemChanged; 
// NOTE: this part is to test if the event is fired... 
Context.MyList.ListChanged += myList_ListChanged; 
myGrid.DataSource = bindingSource; 

У меня есть кнопка добавить, что вызывает метод в контексте как ICommand:

Context.myCommand.Execute(null); 

Наконец, в команде (который находится в классе Контекста), я делаю следующее:

MyList.Add(new Item()); 

Pret прямое выполнение ... bindingSource.CurrentChanged срабатывает правильно, но я никогда не вхожу в событие myList_ListChanged.

Если я остановлюсь на запуске ICommand и добавлю несколько элементов, счет Context.MyList действительно будет обновлен. То же самое происходит, если я использую команду delete ...

Есть ли что-то очевидное, я здесь отсутствует ???

Спасибо заранее, Н.

EDIT я понял, что проблема связана с тем, у меня есть MyList как свойство следующим образом:

BindingList<T> myList; 
public BindingList<T> MyList { 
    get { 
     if (myList == null) { myList = new BindingList<T>();} 
     return myList; 
    } 
} 

Я создаю BindingSource в конструктор формы, тогда как у меня есть следующий код, который вызывается в ViewModel ПОСЛЕ: переплет производится:

myList = new BindingList<T> 
RaisePropertyChanged("MyList"); 

Я знаю, что это мышление WPF, где это будет легко обновлять привязки данных.

Как я понимаю, BindingSource, похоже, не воспринимает изменения самого источника данных (то есть указатель на объект), а не изменения его содержимого.

Может ли быть любезным, чтобы подтвердить это поведение? Спасибо! Н.

+0

'Winforms MVVM' - нет такой вещи. Вы ищете WPF. –

+0

считать его «MVC», если вы действительно хотите ... – neggenbe

+0

Возможный дубликат: http://stackoverflow.com/questions/25966963/bindinglist-listchanged-event-not-firing-until-filled-with-data –

ответ

1

Чтобы преодолеть эту проблему, просто установить привязку к источнику данных следующим образом:

myGrid.DataBindings.Clear(); // binding must be unique, make sure it is!  
myGrid.DataBindings.Add("DataSource", Context, "MyList"); 

Затем, до тех пор, пока изменение собственности поднят на уровне «Контекст», вы будете будь умницей.