1

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

我使用基础架构的 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 通过以下方式连接到 View:

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) ?

我尝试在第二个 ViewModel 中添加这个属性:

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

但我在视图中显示的只是“现金流”列标题,没有实际 cashflowModel 类的任何底层标题。

4

1 回答 1

1

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

this.DataContext = new SomeAwesomeViewModel();

如果您希望不同的控件组使用不同的 ViewModel(例如,Grid.DataContext、StackPanel.DataContext 等),您还可以为容器设置 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));
    }
}
于 2010-06-30T16:09:21.127 回答