2012-03-27 2 views
0

Этот материал MVVM причиняет мне боль. У меня есть приложение, которое имеет список редакторов в левой панели. Справа находится элемент управления вкладкой, в котором будут отображаться редакторы. У меня есть модель основного приложения, содержащая коллекцию моделей представлений. Я называю эту коллекцию Workspaces. Это заимствовано у MvvmDemoApp, которое Microsoft предоставляет here.Как установить шаблон представления/просмотра модели данных во время выполнения?

public ObservableCollection<WorkspaceViewModel> Workspaces 
{ 
    get 
    { 
    ... 
    } 
} 

Эти рабочие области привязаны к вкладке управления в главном окне приложения, как так:

<DataTemplate x:Key "WorkspacesTemplate"> 
    <TabControl 
    IsSynchonizedWithCurrentItem="True" 
    ItemSource="{Binding Workspaces}" 
    SelectedItem="{Binding ActiveWorkspace}"/> 
</DataTemplate> 
... 
<ContentControl 
    Content="{Binding}" 
    ContentTemplate="{StaticResource WorkspacesTemplate}"/>  

Модели ракурса связаны с тем, используя DataTemplates как так:

<DataTemplate DataType="{x:Type vm:MessageLogViewModel}"> 
    <vw:MessageLogView/> 
</DataTemplate> 

Это прекрасно работает. Однако теперь мне нужно настроить приложение, когда список редакторов читается из файла конфигурации. Я предполагаю, что этот файл конфигурации будет содержать компоненты представления и представления для каждого редактора. Но как мне связать их вместе, чтобы, когда кто-то привязывается к модели представления (или коллекции моделей представлений), отображается правильное представление (похожее на то, что делает DataTemplate, а не на код, а не на XAML)?

Я стараюсь держаться подальше от методов инверсии управления (IoC). Я не уверен, что наша команда готова к этому.

ответ

1

IoC - идеальное решение для этого, но без этой возможности вы могли бы создать шаблон данных XAML в модели представления с помощью XmlWriter и разоблачить его как свойство для привязки.

Edit: Наручники

У вас есть список просмотра моделей. Создайте и опубликуйте это свойство XamlTemplate в каждой модели представления (в классе модели базового представления). Свойство должно создать Xaml вдоль линий:

<DataTemplate xmlns:vw="..."> 
    <vw:MessageLogView/> 
</DataTemplate> 

Затем используйте ContentControl для связывания:

<ContentControl Content="{Binding ViewModel}" 
       ContentTemplate="{Binding ViewModel.XamlTemplate}" /> 
+0

Вы можете уточнить? Кто будет привязан к свойству Data Template? – bsh152s

+0

@ bsh152s: Надеемся, что редактирование даст вам еще несколько указателей. –

Смежные вопросы