2010-06-30 5 views
1

Я создал простой MVVM, только с тремя классами CashFlowView, CashFlowViewModel, CashFlowModel.ObjectDataProvider в MVVM не нужен?

Я использую инфраструктурный 9.1 XamDataPresenter (или xamDataGrid).

<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Source={StaticResource CashFlowData}}"> 

    <ObjectDataProvider x:Key="CashFlowData" ObjectType="{x:Type ViewModel:CashflowViewModel}" MethodName="GetCashFlows" /> 

Внутри моего ViewModel:

public ObservableCollection<CashflowModel> GetCashFlows() 
     { 
      return new ObservableCollection<CashflowModel>() { ... }; 
     } 

ViewModel подключен к Смотреть на это:

this.DataContext = new CashflowViewModel(); 

Пока я подключить сетку к ObjectDataProvider его отлично работает нормально. Но я хотел бы просто подключиться к свойству в моей модели ViewModel.

Согласно Infragistics все, что я должен сделать это:

<igDP:XamDataGrid DataSource="{Binding Path=ViewModelCollection}"/> 

Но в данном случае, похоже, мне нужно привязать к коллекции другого ViewModel, чтобы представить свои ряды внутри сетки. И вот где я запутался.

Я попробовал это, и он не работает:

<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Path=CashFlows}"> 

Внутри ViewModel:

public ObservableCollection<CashflowDataGridViewModel> CashFlows 
     { 
      get 
      { 
       return new ObservableCollection<CashflowDataGridViewModel>(); 
      } 
     } 

Но как создать свой второй ViewModel (CashflowDataGridViewModel)?

Я попытался добавить этот proprty в этом втором ViewModel:

public CashflowModel CashFlow 
     { 
      get 
      { 
       return new CashflowModel() {...}; 
      } 
     } 

Но я получаю показано на мой взгляд, «Cashflow» заголовок столбца без какого-либо из основных заголовков фактического класса cashflowModel.

ответ

1

Чтобы иметь возможность привязывать View к свойствам в ViewModel, DataContext должен быть установлен в экземпляр вашего ViewModel. То, что я обычно делаю это, чтобы включить следующую строку в конструкторе коды-за мое зрение:

this.DataContext = new SomeAwesomeViewModel(); 

Вы также можете установить DataContext для контейнеров, если вы хотите, чтобы разных группы элементов управления для использования различных ViewModels (например, , Grid.DataContext, StackPanel.DataContext и т. Д.).

Как только у вас установлен набор DataContext, вы сможете привязываться к свойствам этой модели ViewModel.

Update

Вот немного примеров кода, чтобы вы собираетесь.

public class CashFlowViewModel 
{ 
    public ObservableCollection<FlowViewModel> DataGridData 
    { 
     get... 
    } 
} 

Это свойство, которое должно предоставлять данные для DataGrid. Теперь вот что может выглядеть класс FlowViewModel.

public class FlowViewModel 
{ 
    decimal flowAmount; 
    public decimal FlowAmount 
    { 
     get { return flowAmount; } 
     set 
     { 
      if(flowAmount == value) 
       return; 

      flowAmount = value; 
      NotifyPropertyChanged("FlowAmount"); 
     } 
    } 
    . 
    . 
    . 

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

Привет, Эрик, это уже связано вот так: это.DataContext = new CashflowViewModel(); У меня есть одно свойство внутри второго ViewModel (CashflowDataGridViewModel), и я вижу это свойство. Но не фактическое содержание CashflowModel для каждой строки. Может быть, мне нужны скриншоты, чтобы прояснить это ... – Houman

+0

Я просто перечитываю ваш вопрос, и я думаю, что знаю, что вы просите. Ваш документ CashFlowViewModel должен вывести ObservableCollection , где FlowViewModel представляет данные, которые будут содержаться в одной строке DataGrid? Это верно? Если это так, то создание FlowViewModel должно быть довольно простым. Создайте новый класс, который реализует интерфейс INotifyPropertyChanged. Создайте свойства для каждой записи в строке и убедитесь, что изменения инициируют событие PropertyChanged. –

+0

Thankkkk вы, его работа! :) Теперь я понимаю. Его соблазн просто добавить уведомления к самой модели. Но я думаю, что это ошибка, так как мы будем использовать модель с интерфейсом, таким как INotifyPropertyChanged. Следовательно, лучше иметь второй ViewModel, который обертывает модель и добавляет туда возможности INotifyPropertyChanged. Правильно ли мое предположение? – Houman

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

  • Нет связанных вопросов^_^