ObjectDataProvider в MVVM не нужен? - PullRequest
1 голос
/ 30 июня 2010

Я создал простой MVVM только с тремя классами CashFlowView, CashFlowViewModel, CashFlowModel.

Я использую XamDataPresenter (или xamDataGrid) Infragistic's 9.1.

    <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 подключен к View следующим образом:

this.DataContext = new CashflowViewModel();

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

В соответствии с инфраструктурой все, что мне нужно сделать, это:

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

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

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

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

Внутри модели представления:

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

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

Я пытался добавить это свойство в течение этой второй ViewModel:

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

Но все, что я вижу, - это заголовок столбца "Cashflow" без каких-либо нижележащих заголовковфактического класса cashflowModel.

1 Ответ

1 голос
/ 30 июня 2010

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

this.DataContext = new SomeAwesomeViewModel();

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

Ниже приведен пример кода.

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));
    }
}
...