Проблема привязки шаблона данных MVVM - PullRequest
1 голос
/ 18 января 2011

Возможно, это случай слишком большого количества лекарств от простуды, но я просто не могу получить правильную привязку.

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

<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

Я знаю, что упускаю что-то здесь очевидное, но Найквил и его друзья предают меня ...

* 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>

Ответы [ 2 ]

1 голос
/ 18 января 2011

Хорошо, вы еще не показали код для DefaultViewViewModel, но я предполагаю, что вы определили «Content» как поле, а не как свойство.и перебить его, сделав Content надежным свойством зависимости, которое помогает

0 голосов
/ 18 января 2011

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

Больше мне не нужно ни слова ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...