【问题标题】:Binding View and ViewModel on a DataGrid在 DataGrid 上绑定 View 和 ViewModel
【发布时间】:2014-05-26 23:16:53
【问题描述】:

我正在使用在现有 ViewModel 上设置的 View 和 ViewModel。您可以说这是放置第二个 ViewModel 的基础。

当在 MainViewModel 的底层 ViewModel 中放置另一个 ViewModel(在此特定示例中为 BrowseViewModel)时,关联的 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 在之前命名的命名空间中查找 View 及其 ViewModel,这没有问题。

【问题讨论】:

  • 您如何编写 MainView 以显示您的 TestControlView?你能给我们一个例子(XAML)我有一个想法,但要确认一下......
  • @mvermef 好了。我更新了我的问题并包含了一些真实姓名以使事情清楚。我应该说我在DataGrid 上使用这个ViewModel,但是我现在提供了。

标签: c# wpf mvvm caliburn.micro caliburn


【解决方案1】:

看来您在 BrowseView 中将某些内容绑定到 DataGrid 正确吗?

声明类似

<ContentControl x:Name="ListingViewModel"/>

是声明的简写形式

<ContentControl cal:View.Model="{Binding ListingViewModel" />

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

【讨论】:

  • 感谢您的快速回复!我实际上认为 MainViewModel 和 BrowseViewModel 之间的绑定在某种程度上是不正确的。此问题发生在每个基础 ViewModel 上,而不仅仅是 DataGrid 的那个。关于如何正确调试的任何想法?
  • 是的,您可以使用 Logging 进行调试,这可以通过控制台输出进行设置,向您展示事情是如何融合在一起的。 GamingLibrary 在示例中有一个示例
  • 是的,我完全忘了问数据网格的内容是否会产生这种情况?模型在数据网格上是什么样子的,因为如果它不包含 BrowserViewModel 的任何内容,那么它将永远不会显示 ListingViewModel 项目
  • @mvermef 是的,这是原因之一,但视图仍然对我隐藏。如上所述,我假设绑定不正确或者我需要实现任何其他功能。偶然发现Screen,但这不是我想要的,因为我的控件只加载一次,因此不需要动态管理。
  • 什么当前绑定到您的 DataGrid 的 ItemsSource?这将告诉我们 RowDetailsTemplate 中的 DataContext 是什么。
【解决方案2】:

试试这个...

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

这应该获取您的 BrowseView 并相应地绑定,因为 MainViewModel 拥有 BrowseViewModel 属性,它应该正确绑定。这假定&lt;ProjectName&gt;.Views.BrowseView 命名空间和&lt;ProjectName&gt;.ViewModels.BrowseViewModel,同样使用ListingViewModel

【讨论】:

  • 按名称绑定和按cal:View.Context/Model 绑定有什么区别?我像你描述的那样做了,但 Caliburn 说它找不到 BrowseViewModel 的任何实例。虽然我正确设置了命名空间和 Caliburn。有什么想法吗?
  • 不同之处在于您直接指定这是您想要在此内容控件上使用的视图和模型。在数据模板中使用命名方法时,由于我之前见过的模板的可视树问题,可能找不到视图模型,但这与嵌入在列表视图中的上下文菜单有关。您可以尝试 x:Name="BrowserViewModel" 因为这是您的 ViewModel 的名称,但我认为它不会起作用。老实说,从未尝试在数据网格中的数据模板中嵌入内容控件。
  • 大多数视图切换是通过 完成的当前是数据上下文的父视图模型,但它可以更改,因为所有上下文/模型项都只是位置的字符串汤。
  • 嗯,主要问题是,当我将 ViewModel 绑定到 MainViewModel 时,它实际上可以工作,就像我在开始的帖子中所做的那样。问题是,将另一个 ViewModel 绑定到绑定到 MainViewModel 的 ViewModel 不起作用,因为它没有显示。没有人试图做到这一点吗?很奇怪。
  • 你用什么容器做这个? MEF、simplecontainer 等?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多