如何打开页面并分配其datacontext

时间:2012-11-17 18:57:12

标签: c# wpf datacontext

我猜,我的问题相对容易。 我有一个页面来显示我的数据。单击一个按钮,我想打开一个新页面,其中元素的datacontext位于当前元素的datacontext上方2层。

说明:

我的ViewModel是一个包含更多ViewModel的类(ViewModelContainer)。一个是值的摘要,一个是详细的视图。

public class SummaryViewModel
{
     public int somevalue; // is a property
     public ObservableCollection<SummarizedItems> items; // is a property
}

public class DetailsViewModel
{
     public int someOthervalue; // is a property
     public int stuffA; // is a property
     public int stuffB; // is a property
}

public class ViewModelContainer : ViewModelBase
{
     private SummaryViewModel _sum;
     public SummaryViewModel sum { }  // is a property

     private DetailsViewModel _det;
     public DetailsViewModel det { }  // is a property
}

我可以按下按钮的视图绑定到SummaryViewModel的ObservableCollection的值。 到目前为止一切都很好。当我按下按钮时,应打开一个显示详细信息的新页面。我使用ICommand来处理点击,并将详细信息视图作为CommandParameter传递给它。

<Button Name="OpenDetailsButton" Command="{Binding Path=ACommand}" CommandParameter="{DynamicResource Details}"

我将页面定义为同一文件中的资源,其中datacontext仍然是ViewModelContainer。

<pages:DetailsViewPage DataContext="{Binding Path=det }"  x:Key="Details"/>

页面打开,但datacontext不可用。我收到以下错误:

  System.Windows.Data Error: 3 : Cannot find element that provides DataContext.

有谁知道如何打开详细信息视图并提供datacontext?我无法将DetailsViewModel移动到另一个类,因为只能在那里更新它。

由于

2 个答案:

答案 0 :(得分:0)

我通过创建一个帮助程序来上升可视树并使用我需要的元素的datacontext来解决问题。感谢所有试图提供帮助的人:)

方法如下:

    public static UIELEMENT FindUiElementUpVisualTree(DependencyObject initial)
    {
        DependencyObject current = initial;

        while (current != null && current.GetType() != typeof(UIELEMENT))
        {
            current = VisualTreeHelper.GetParent(current);
        }
        return current as UIELEMENT;
    }

其中UIELEMENT是您要查找的对象,例如一个窗口或一个按钮或什么的。

答案 1 :(得分:0)

通常视图和视图模型具有一对一的关系。在这种情况下,似乎存在多对一的关系。如何使用DetailsPageViewModel?