Я использовал пару ключ / значение для всех моих 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 делает это автоматически.
И тогда я готов.Мне больше не нужно трогать мой файл ресурсов.:)