【发布时间】:2011-01-17 21:26:03
【问题描述】:
也许这是感冒药过多的情况,但我似乎无法正确设置此绑定。
这是(简化的)窗口,每个 ViewModel 类型都有一个 DataTemplate,它应该只显示一个关联的视图:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type local:DefaultViewViewModel">
<local:DefaultView />
</DataTemplate>
<DataTemplate DataType="{x:Type other:AnotherViewModel">
<other:AnotherView />
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding CurrentViewModel}" />
</Grid>
</Window>
这里是一些 MainViewModel(为简洁起见,实际的 ShowABCView 方法是比此处显示的更多功能的命令函数):
class MainViewModel : ViewModelBase
{
private Stack<ViewModelBase> mContentViewStack;
public MainViewModel()
{
mContentViewStack = new Stack<ViewModelBase>();
ShowDefaultView();
}
public ViewModelBase CurrentViewModel
{
get { return mContentViewStack.Peek(); }
}
private ShowDefaultView()
{
DefaultViewViewModel viewModel = new DefaultViewViewModel();
mContentViewStack.Push(viewModel);
NotifyPropertyChanged("CurrentViewModel");
}
private ShowAnotherView()
{
AnotherViewModel viewModel = new AnotherViewModel();
mContentViewStack.Push(viewModel);
NotifyPropertyChanged("CurrentViewModel");
}
}
以及MainWindow的启动代码:
public MainWindow()
{
this.DataContext = new MainViewModel();
}
当我运行它时,我得到了错误
System.Windows.Data.Error:40: BindingExpression 路径错误: 找不到“内容”属性 '对象' 'DefaultViewViewModel'
我知道我在这里遗漏了一些明显的东西,但是 Nyquil 和朋友们背叛了我......
*编辑 - DefaultViewViewModel 和 DefaultView *
DefaultViewViewModel:
// ViewModelBase is basically just a wrapper for INotifyPropertyChanged,
// plus some other common-to-my-project properties
// (NOT INCLUDING A Content PROPERTY)
class DefaultViewViewModel : ViewModelBase
{
public DefaultViewViewModel() : base()
{
}
}
默认视图:
<UserControl ...>
<TextBlock Text="Some Hard Coded Text Formatted To My Liking" />
</UserControl>
【问题讨论】:
-
你能给我们展示一下 DefaultViewViewModel 类吗?
-
我可以,但你不会从中得到太多... :)
-
错误实际上可能出现在 DefaultView 中,该错误与绑定到 DeafultViewViewModel 上的属性的内容有关,查看您的代码应该是 DefaultView。
-
如果您从绑定中完全删除路径,您会收到什么(如果有)错误消息?
-
那么我不得不说这不仅仅是 nyquil - 应该 起作用。这不像您甚至在路径中指定 Content 属性。通常我会使用 ContentPresenter 而不是 ContentControl,但这不应该有任何区别,而且我不在电脑前进行测试!