WPF + MVVM: Как отобразить ВМ через словарь ресурсов - PullRequest
2 голосов
/ 12 июля 2010

В данный момент я создаю новый экземпляр View и ViewModel и назначаю view.DataContext = vm в приложении в обработчике события запуска приложения

В http://msdn.microsoft.com/en-us/magazine/dd419663.aspx вВ главе «Применение представления к ViewModel» я прочитал, что было бы неплохо связать объект ViewModel для просмотра через ресурсы.

Правильно ли я понимаю, что, используя предложенный подход, я должен:

  1. Создать ресурс в «MainPage», который будет иметь раздел «DataTemplate» для каждой пары View / ViewModel;
  2. Привязать экземпляр объекта ViewModel к MainPage?

Я прав?

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

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Я использовал пару ключ / значение для всех моих ViewModel / View, как предлагает aqwert, но как только вы получаете пару дюжин или более одного :), ViewModels начинает становиться довольно утомительным и склонным к опечаткам.

Лично мне нравится, когда IValueConverter выполняет работу за меня и использует Convention для определения местоположения View.

Например, скажем, у меня есть мои модели представлений в пространстве имен MyApp.ViewModels и все мои представления в пространстве имен MyApp.Views, и у меня есть суффикс ViewModel за всеми моими виртуальными машинами и суффикс View за всеми моими представлениями

Все, что мне нужно сделать, это:

1) Все мои ViewModel наследуют от базового класса ViewModelBase

2) Поместите это в мойсловарь ресурсов приложения

<m:ViewModelConverter x:Key="ViewModelConverter"/>
<DataTemplate DataType="{x:Type vm:ViewModelBase}">
    <ContentControl Content="{Binding Converter={StaticResource ViewModelConverter}}"/>
</DataTemplate>

3) Создайте мой конвертер, ниже приведен лишь пример, который вы можете изменить в соответствии со своим соглашением.

public class ViewModelConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            Type ViewModelType = value.GetType();
            string ViewNameSpace = ViewModelType.Namespace.Replace("ViewModel", "View");
            string ClassName = ViewModelType.Name.Replace("Model", string.Empty);
            Type ViewType = Type.GetType(string.Format("{0}.{1}", ViewNameSpace, ClassName));
            if (ViewType != null)
                return Activator.CreateInstance(ViewType);
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}

Выше будет попытаться найти представление, если это не так, он просто вернет ViewModel, который он пытался преобразовать (который WPF просто вызовет .ToString () on)

Вам не нужно беспокоиться о фактическом подключении ViewModel кПросмотр DataContext, потому что WPF делает это автоматически.

И тогда я готов.Мне больше не нужно трогать мой файл ресурсов.:)

2 голосов
/ 12 июля 2010

Принцип работы этого метода заключается в том, что вместо непосредственного поиска и создания представлений wpf может найти представление через шаблоны данных. поэтому, когда у вас есть следующее в ваших ресурсах приложения. Это управляет пользовательским интерфейсом в зависимости от того, какую ViewModel вы хотите отобразить, и вам не нужно беспокоиться о кодировании представления.

<DataTemplate DataType="{x:Type vm:MyViewModel}">
    <ui:MyView />
</DataTemplate>

Примечание: vm: и ui: это просто пространства имен xml, объявленные в верхнем элементе файла ресурсов. затем вы можете просто создать универсальное окно, которое будет «находить» вид с помощью ContentControl

<Window ...>
    <ContentControl Content="{Binding}" />
</Window>

var window = new Window();
window.DataContext = new MyViewModel();
window.Show();

Это отобразит встраивание окна MyView в качестве содержимого окна. При условии, что в вашем представлении установлены привязки, указывающие на свойства в вашем представлении, модель подключена успешно. Не нужно «новый» вид. Главное окно можно использовать повторно, просто назначив другую модель представления контексту данных.

Также, если вы сообщите нам, какие именно у вас проблемы, мы сможем дать более конкретный ответ, если вышеприведенное не соответствует вашим требованиям.

НТН

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