Как установить viewModel в ContentControl

У меня есть пользовательский элемент управления, который определяет ContentControl следующим образом:

<ContentControl x:Name="PART_contentHost" Grid.Row="1"/>

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

<DataTemplate DataType="{x:Type ViewModels:Test1ViewModel}">
        <Views:Test1View />
</DataTemplate>

Это означает, что я хочу, чтобы Test1ViewModel отображался внутри contentControl. Я не могу установить это в своем коде С#.

//this gets the contentControl from de template
contentHost = this.Template.FindName(contentHostName, this) as ContentControl; 
//this assigns the test1ViewModel
contentHost.Content = content

Что мне не хватает?


person mekoloko    schedule 18.03.2013    source источник
comment
Расскажите больше о проблеме или о том, что не работает. Вы получаете исключение?   -  person Brian S    schedule 18.03.2013
comment
какой тип вашей модели представления/представления загружается в элемент управления содержимым. Это пользовательский элемент управления, страница и т. д.? Покажите код, в котором вы определяете и получаете контент   -  person J King    schedule 18.03.2013
comment
Ваш <DataTemplate> не устанавливает содержимое, он устанавливает DataContext. Все, что он делает, это говорит WPF, что когда он пытается отобразить Test1ViewModel в VisualTree, он должен отрисовать его с помощью Test1View и установить DataContext (уровень данных) за Test1View в качестве ViewModel.   -  person Rachel    schedule 18.03.2013


Ответы (2)


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

введите здесь описание изображения

Xaml:

<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>
<Window.Resources>
    <DataTemplate DataType="{x:Type local:Test1ViewModel}">
        <local:Test1View />
    </DataTemplate>
</Window.Resources>
<Grid>
    <ContentControl Content="{Binding ContentModel}" />
</Grid>

Тест1Вид:

<UserControl x:Class="WpfApplication1.Test1View" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBlock Text="{Binding Name}" Background="Beige" Padding="5"  />
        <TextBlock Text="{Binding Address}" Background="PeachPuff" Padding="5" />
    </StackPanel>
</UserControl>

ViewModels:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private Test1ViewModel _contentModel;
    public Test1ViewModel ContentModel { get { return _contentModel; } set { _contentModel = value; OnPropertyChanged("ContentModel"); } }

    public ViewModel()
    {
        this.ContentModel = new Test1ViewModel() { Name = "John Higgins", Address = "Wishaw" };
    }

}

public class Test1ViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name { get { return _name; } set { _name = value; OnPropertyChanged("Name"); } }

    private string _address;
    public string Address { get { return _address; } set { _address = value; OnPropertyChanged("Address"); } }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
person Mike Fuchs    schedule 18.03.2013
comment
Спасибо за ваше решение!! Действительно, я использую MVVM, и оба ответа в порядке, я упустил одну мелочь о том, как привязать модель представления к содержимому contentControl. - person mekoloko; 20.03.2013

Я уже делал что-то в этом роде. Этот код должен помочь вам начать.

    public void FindAndSetTemplateContent( ContentControl target, ViewModelBase item)
    {
        if (target == null)
            throw new ArgumentNullException("target");

        if (item == null)
            throw new ArgumentNullException("item");

        var template = target.TryFindResource(new DataTemplateKey(item.GetType())) as DataTemplate; // this will pick up your resource for the viewmodel
        if (template == null)
            return null;

        var content = template.LoadContent() as ContentControl ;
        if (content != null)
        {
            content.DataContext = item;
        }
        return content;
    }
person TYY    schedule 18.03.2013
comment
Это также подходит для получения элемента шаблона, что очень полезно. Спасибо! - person mekoloko; 19.03.2013