.net MVVM中的ObjectDataProvider是否不必要?

.net MVVM中的ObjectDataProvider是否不必要?,.net,wpf,mvvm,objectdataprovider,xamdatagrid,.net,Wpf,Mvvm,Objectdataprovider,Xamdatagrid,我创建了一个简单的MVVM,只有三个类:CashFlowView、CashFlowViewModel和CashFlowModel 我使用infragistic的9.1 XamDataPresenter(或xamDataGrid) 只要我将网格连接到ObjectDataProvider,它就可以正常运行。但我希望我可以只连接到ViewModel中的属性 根据Infrastics,我要做的就是: <igDP:XamDataGrid DataSource="{Binding Path=ViewM

我创建了一个简单的MVVM,只有三个类:CashFlowView、CashFlowViewModel和CashFlowModel

我使用infragistic的9.1 XamDataPresenter(或xamDataGrid)

只要我将网格连接到ObjectDataProvider,它就可以正常运行。但我希望我可以只连接到ViewModel中的属性

根据Infrastics,我要做的就是:

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

但是我在视图上看到的只是“Cashflow”列标题,而没有实际cashflowModel类的任何底层标题。

要将视图绑定到ViewModel上的属性,需要将DataContext设置为ViewModel的实例。我通常做的是在我的视图的代码隐藏构造函数中包含以下行:

this.DataContext = new SomeAwesomeViewModel();
如果希望不同的控件组使用不同的视图模型(例如Grid.DataContext、StackPanel.DataContext等),还可以为容器设置DataContext

一旦设置了DataContext,就应该能够绑定到该ViewModel的属性

更新

这里有一些示例代码可以帮助您继续

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

为了能够将视图绑定到ViewModel上的属性,需要将DataContext设置为ViewModel的实例。我通常做的是在我的视图的代码隐藏构造函数中包含以下行:

this.DataContext = new SomeAwesomeViewModel();
如果希望不同的控件组使用不同的视图模型(例如Grid.DataContext、StackPanel.DataContext等),还可以为容器设置DataContext

一旦设置了DataContext,就应该能够绑定到该ViewModel的属性

更新

这里有一些示例代码可以帮助您继续

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

嗨,Eric,它已经像这样连接:this.DataContext=new CashflowViewModel();我在第二个ViewModel(CashflowDataGridViewModel)中有一个属性,我可以看到该属性。但不是每行的现金流模型的实际内容。也许我需要截图来澄清这一点……我只是重新阅读了你的问题,我想我知道你在问什么。您的CashFlowViewModel需要公开一个ObservableCollection,其中FlowViewModel表示将包含在DataGrid的一行中的数据?对吗?如果是这样,那么创建FlowViewModel应该非常简单。创建一个实现INotifyPropertyChanged接口的新类。为行中的每个条目创建属性,并确保更改触发PropertyChanged事件。谢谢,它正在工作!:)现在我明白了。仅仅将通知添加到模型本身是很有诱惑力的。但是我认为这是一个错误,因为我们会用接口的东西,比如INotifyPropertyChanged来处理模型。因此,最好使用第二个ViewModel包装模型,并在其中添加INotifyPropertyChanged功能。我的假设正确吗?很好!很高兴它起作用了。是的,你是对的;模型应该只关注它的…建模。它不应该关心需要实现什么来显示视图。这就是ViewModel的工作。因此,关注点的分离是,(1)视图只显示数据并允许交互。它通过数据绑定接收数据。(2) 模型包含要操作的数据。(3) ViewModel负责从模型中获取数据并将其呈现给视图。嗨,Eric,它已经这样连接:this.DataContext=new CashflowViewModel();我在第二个ViewModel(CashflowDataGridViewModel)中有一个属性,我可以看到该属性。但不是每行的现金流模型的实际内容。也许我需要截图来澄清这一点……我只是重新阅读了你的问题,我想我知道你在问什么。您的CashFlowViewModel需要公开一个ObservableCollection,其中FlowViewModel表示将包含在DataGrid的一行中的数据?对吗?如果是这样,那么创建FlowViewModel应该非常简单。创建一个实现INotifyPropertyChanged接口的新类。为行中的每个条目创建属性,并确保更改触发PropertyChanged事件。谢谢,它正在工作!:)现在我明白了。仅仅将通知添加到模型本身是很有诱惑力的。但是我认为这是一个错误,因为我们会用接口的东西,比如INotifyPropertyChanged来处理模型。因此,最好使用第二个ViewModel包装模型,并在其中添加INotifyPropertyChanged功能。我的假设正确吗?很好!很高兴它起作用了。是的,你是对的;模型应该只关注它的…建模。它不应该关心需要实现什么来显示视图。这就是ViewModel的工作。因此,关注点的分离是,(1)视图只显示数据并允许交互。它通过数据绑定接收数据。(2) 模型包含要操作的数据。(3) ViewModel涉及从模型中获取数据并将其呈现给视图。
public ObservableCollection<CashflowDataGridViewModel> CashFlows
        {
            get
            {
                return new ObservableCollection<CashflowDataGridViewModel>();
            }
        }
public CashflowModel CashFlow
        {
            get
            {
                return new CashflowModel() {...};
            }
        }
this.DataContext = new SomeAwesomeViewModel();
public class CashFlowViewModel
{
    public ObservableCollection<FlowViewModel> DataGridData
    {
        get...
    }
}
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));
    }
}