2010-06-30 58 views
1

我创建了一个简单的MVVM,只有三个类CashFlowView,CashFlowViewModel,CashFlowModel。MVVM中的ObjectDataProvider不是必需的吗?

我使用了一个infragistic的9.1 XamDataPresenter(或者xamDataGrid)。

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

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

在我的视图模型:

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

视图模型连接通过此功能查看:

this.DataContext = new CashflowViewModel(); 

只要我在网格连接到ObjectDataProvider的完美它运行良好。但我希望能够连接到我的ViewModel中的一个属性。

根据Infragistics的所有我需要做的是这样的:

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

但在这种情况下,看来我需要绑定到另一个视图模型的集合,代表网格内我行。那就是我感到困惑的地方。

我尝试这样做,它不工作:

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

视图模型内部:

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

但是我怎么创建我的第二个视图模型(CashflowDataGridViewModel)?

我尝试添加第二个视图模型中则此属性:

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

但我得到显示在我的观点是没有任何实际cashflowModel类的基本报头的“现金流”列标题。

回答

1

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

this.DataContext = new SomeAwesomeViewModel(); 

您还可以,如果你想的控制使用不同的ViewModels不同群体设置的DataContext的容器(如,Grid.DataContext,StackPanel.DataContext等)。

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

更新

这里有点示例代码让你去。

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

嗨,Eric,它已经这样连接了:this。DataContext = new CashflowViewModel();我有第二个ViewModel(CashflowDataGridViewModel)中的一个属性,我可以看到该属性。但不是每行的CashflowModel的实际内容。也许我需要截图来澄清这... – Houman 2010-06-30 16:12:36

+0

我只是重新读你的问题,我想我知道你在问什么。 您的CashFlowViewModel需要公开一个ObservableCollection ,其中FlowViewModel表示将包含在DataGrid的一行中的数据?那是对的吗? 如果是这样,那么创建FlowViewModel应该非常简单。创建一个实现INotifyPropertyChanged接口的新类。为行中的每个条目创建属性,并确保更改触发PropertyChanged事件。 – 2010-06-30 19:28:32

+0

Thankkkk你,它的工作! :) 现在我明白了。它很容易将通知添加到模型本身。但是我认为这是一个错误,因为我们会使用INotifyPropertyChanged之类的接口来监视模型。因此,最好有一个包装模型的第二个ViewModel,并在其中添加INotifyPropertyChanged功能。我的假设是否正确? – Houman 2010-07-01 09:27:58