Класс локатора MVVM в библиотеках классов silverlight - PullRequest
0 голосов
/ 24 января 2011

Я экспериментирую с шаблоном MVVM, в частности я пытаюсь определить, как я собираюсь работать с отдельными библиотеками классов, которые содержат представления (и модели представлений). Глядя на сеть, кажется, что это делается по-разному как с призмой, так и с MEF, и, возможно, именно это я и сделаю. Однако сначала я работаю с образцом ServiceLocator, который Джон Папа создал .

В этом примере местоположение ViewModelLocator определено в app.xaml как статический ресурс:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:MVVMLib="clr-namespace:MVVMLib;assembly=MVVMLib" 
    x:Class="VMLocatorDemo.App">
    <Application.Resources>
        <MVVMLib:ViewModelLocator x:Key="VMLocator"/>
        <MVVMLib:IndexerConverter x:Key="VMIndexerConverter" />
    </Application.Resources>
</Application>

и поскольку view.xaml находится в том же проекте, он может ссылаться на локатор, и все в порядке:

<Grid x:Name="LayoutRoot" Background="White" 
      DataContext="{Binding Source={StaticResource VMLocator}, Converter={StaticResource VMIndexerConverter}, ConverterParameter=MainPageViewModel}">        
    <TextBlock Text="{Binding Path=CompanyName}"/>
</Grid>

Однако с отдельными библиотеками классов я не могу этого сделать, потому что view.xaml не знает, где находится локатор. Мне нужно, чтобы определение оставалось в xaml, чтобы я мог продолжать работать с различными моделями представления времени выполнения / разработки.

Полагаю, мой вопрос в том, как определить класс Locator в библиотеке классов или именно поэтому требуются другие инструменты, такие как MEF и / или призма?

Большое спасибо

Jason

1 Ответ

0 голосов
/ 24 января 2011

Здесь используется поведение, и по умолчанию используется соглашение, чтобы найти представление.У нас есть сервисный локатор, но я думаю, его можно улучшить, чтобы он не зависел от этого статического класса

public class ViewModelLocatingBehavior : Behavior<FrameworkElement>
    {
      #region Overrides

        protected override void OnAttached()
        {
            base.OnAttached();
            var viewType = AssociatedObject.GetType();

            var viewName = viewType.Name;
            var viewModelName = viewName.EndsWith("View")
                                    ? viewName + "Model"
                                    : viewName + "ViewModel";

         AssociatedObject.DataContext = ServiceLocator.Current.GetInstance<object>(viewModelName);
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
        }

        #endregion

    }

в XAML

<i:Interaction.Behaviors>
    <u:ViewModelLocatingBehavior/>
</i:Interaction.Behaviors>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...