说明:
我的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移动到另一个类,因为只能在那里更新它。
由于
答案 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?