2011-01-17 3 views
1

Возможно, это случай слишком холодной медицины, но я просто не могу получить эту привязку правильно.MVVM DataTemplate Binding Issue

Здесь (упрощенно) Окно с более DataTemplate для каждого типа ViewModel, который должен просто показать соответствующий вид:

<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 path error: 'Content' property not found on 'object' 'DefaultViewViewModel'

Я знаю, что я что-то очевидное здесь отсутствует, но Nyquil и друзья предают меня ...

* EDIT - 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() 
    { 
    } 
} 

DefaultView:

<UserControl ...> 
    <TextBlock Text="Some Hard Coded Text Formatted To My Liking" /> 
</UserControl> 
+0

Вы можете показать нам класс DefaultViewViewModel? – Notter

+0

Я могу, но вы не получите многого из этого ... :) –

+0

Ошибка действительно может быть в DefaultView, ошибка связана с чем-то, что привязывается к свойству в DeafultViewViewModel, который, глядя на ваш код, должен быть DefaultView. – ColinE

ответ

0

нашел ответ выше, где я смотрел. Была некорректная привязка (использовалось регулярное связывание без RelativeSource TemplatedParent) в базовом элементе управления View, используемом всеми нашими представлениями.

Нет больше Nyquil для меня ...

1

Ну вы не показали код для DefaultViewViewModel еще , но я думаю, вы определили «Content» в поле, а не как собственность.

, чтобы убедиться, что он будет исправить это, идти вперед и Overkill его, сделав Content свойство зависимостей надежду, что помогает