2010-02-28 4 views
1

Делать что-то вроде этого:Как применить ViewModel к UserControl внутри страницы?

<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}"> 
<vw:AllCustomersView /> 
</DataTemplate> 

Работает в ResourceDictionary для того, когда я хочу, чтобы применить ViewModel к UserControl как корень, но как то же самое, когда у меня есть UserControl внутри Page?``\ Would I create a ResourceDictionary for all my Pages then at the top of each Page` сделать что-то вроде:

<Page.Resources> 
     <ResourceDictionary Source="../MainWindowResources.xaml"/>   
</Page.Resources> 

ответ

0

(.. Я прошу прощения за не комментируя вопрос Мой комментарий слишком длинный)

Не могли бы вы уточнить вопрос, пожалуйста?

У вас есть UserControl с указанным DataTemplate в его собственных ресурсах, верно?

Теперь вы хотите использовать этот элемент управления на странице, не так ли?

И ваш вопрос: вам нужно объявлять ресурсы для UserControl на каждой странице, которая его использует?

Если для доступа к этим ресурсам необходим только пользовательский элемент управления, нет необходимости его повторного использования в другом месте. Если вы хотите, чтобы эти ресурсы были доступны для страницы хостинга (или какого-либо элемента вверх по иерархии), ресурсы должны быть объявлены там. Если они должны быть доступны в любом месте приложения, рекомендуется объявить их на уровне приложения.

+0

Да, у меня есть UserControl, который я хочу внутри страницы. Я спрашиваю, как применить ViewModel где-то вроде App.xaml к UserControl внутри страницы? Благодаря! – Mike

+0

В приложении MVVM вам понадобятся вспомогательные методы для соединения между представлением и моделью представления. Я использую библиотеку от Марка Смита по адресу: http://www.julmar.com/blog/mark/2009/08/04/MVVMHelpersV103.aspx. Он определяет службу, которая создает новое окно и правильно устанавливает контекст данных в модель представления. – Timores

0

Лучшим вариантом будет включение ресурсов в ваш App.xaml. Таким образом, в любом месте, где вы показываете свой ViewModel в приложении, вы получите шаблон.

0

Я согласен с Abe. Все, что вам нужно сделать, это добавить ресурс словарь файл проекта (например, Resources.xaml

поставил

<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}"> 
<vw:AllCustomersView /> 
</DataTemplate> 

внутри него и затем в вашем App.xaml поместить следующее:.

<Application.Resources> 
    <ResourceDictionary Source="Resources.xaml"/> 
</Application.Resources> 

Итак, всякий раз, когда WPF пытается выяснить, как визуализировать класс (который он в настоящее время не знает, как визуализировать), он просматривает ресурсы управления, если там нет шаблона, он проверяет ресурсы контейнера элементов управления. там он продолжает расти, пока не будет контейнера. Затем он переходит к Appl ication.Resources. Если он найдет его, он будет использовать этот шаблон. Если нет, то он просто вызывает ToString(). Поместите все свои глобальные материалы в Application.Resources, чтобы вы не повторяли себя по всему своему приложению, держите его сухим (не повторяйте сами).

На боковой ноте. Я нашел this post самым простым решением для привязки большого количества ViewModels к представлениям без явного написания каждого в ресурсном словаре. Он использует IValueConverter для динамического возврата желаемого вида.

+0

Но проблема в том, что AllCustomersView является , и вы не можете применить DataTemplate таким образом: <оч.сл.: AllCustomersView /> к странице, DataTemplate применяется к вещам, полученным из ContentControl, таких как UserControl, которые не поддерживаются AllCustomersView. Я хочу применить DataTemplate к UserControl внутри страницы AllCustomersView. – Mike

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