在DataGrid上绑定View和ViewModel

时间:2014-04-12 20:19:01

标签: c# wpf mvvm caliburn.micro caliburn

我正在使用已存在的ViewModel上的View和ViewModel。你可以说这是放置第二个ViewModel的基础。

将另一个ViewModel放置在MainViewModel(此特定示例中的BrowseViewModel)的基础ViewModel中时,关联的ViewModel不会显示。

实施如下:

class MainViewModel : PropertyChangedBase
{
    private BrowseViewModel _BrowseViewModel= new BrowseViewModel();

    public BrowseViewModel BrowseViewModel
    {
        get { return _BrowseViewModel; }
        set
        {
            if (_BrowseViewModel== value) return;
            _BrowseViewModel= value;
            NotifyOfPropertyChange("BrowseViewModel");
        }
    }
}

class BrowseViewModel: PropertyChangedBase
{
    private ListingViewModel _ListingViewModel = new ListingViewModel();
    public ListingViewModel ListingViewModel
    {
        get { return ListingViewModel; }
        set
        {
            if (_ListingViewModel == value) return;
            _ListingViewModel = value;
            NotifyOfPropertyChange("ListingViewModel");
        }
    }
}

ListingViewModel...

(我在这里剪掉了不相关的代码)

在我的标记(MainView)中实现:

<ContentControl x:Name="BrowseViewModel"/>

BrowseView

<DataGrid.RowDetailsTemplate>
     <DataTemplate>
         <ContentControl x:Name="ListingViewModel"/>
      </DataTemplate>
</DataGrid.RowDetailsTemplate>

当我将另一个ViewModel添加到MainViewModel的现有基础ViewModel时,我遇到了完全相同的问题。如果我没有底层的ViewModel,如果我使用当前的MainViewModel,一切都会正常工作。

注意:我告诉Caliburn在先前命名的命名空间中查找Views及其ViewModel,这没有问题。

2 个答案:

答案 0 :(得分:2)

看来你在BrowseView中绑定了一些DataGrid是正确的吗?

声明类似

的内容
<ContentControl x:Name="ListingViewModel"/>

是声明

的简写版本
<ContentControl cal:View.Model="{Binding ListingViewModel" />

因此我假设(自从我在WPF工作已经有一段时间了)RowDetailsTemplate中的DataContext不是BrowseViewModel,而是你绑定到DataGrid的任何东西。

答案 1 :(得分:1)

试试这个......

<ContentControl cal:View.Context="BrowseView" cal:View.Model="BrowseViewModel" />

这应该得到你的BrowseView并相应地绑定,因为MainViewModel持有BrowseViewModel prop它应该正确绑定。这假定<ProjectName>.Views.BrowseView命名空间和<ProjectName>.ViewModels.BrowseViewModel,与ListingViewModel

一样