MVVM DataTemplate绑定问题

时间:2011-01-17 21:26:04

标签: wpf mvvm binding

也许这是一个过多的感冒药的情况,但我似乎无法让这个Binding正确。

这是(简化)窗口,每个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方法是Command函数,其功能超出此处所示):

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路径错误:   未找到“内容”属性   'object''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>

2 个答案:

答案 0 :(得分:1)

你还没有显示DefaultViewViewModel的代码 但我的猜测是你将“内容”定义为一个字段,而不是一个属性。

确保它将修复它,通过使Content成为依赖属性来继续进行过度杀伤 希望有所帮助

答案 1 :(得分:0)

在我正在寻找的上游找到答案。在我们的所有视图使用的基本View控件中存在不正确的绑定(使用常规绑定而没有TemplatedParent的RelativeSource)。

对我来说不再是Nyquil ......