Использование локатора модели MVVM Light View с дочерним окном в Silverlight 4 - PullRequest
2 голосов
/ 17 августа 2011

Я хочу использовать View Model Locator в дочернем окне.Проблема в том, что это не работает:

<controls:ChildWindow x:Class="Views.PopupViews.AddAlert"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:controls="clr namespace:System.Windows.Controls;assembly=System.Windows.Controls"
       DataContext="{Binding AddAlert, Source={StaticResource Locator}}>

Я получаю сообщение об ошибке: Не удается найти ресурс с указателем имени / ключа

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Хорошо, причина, по которой это не работает, заключается в том, что мое childWindow создано внутри ctor в IApplicationService.

Этот сервис всплывающего окна объявлен в App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator xmlns:vm="clr-namespace:Client.ViewModel" x:Key="Locator" />
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
<Application.ApplicationLifetimeObjects>
    <popup:myPopupService/>
</Application.ApplicationLifetimeObjects>

Видимо, представление было создано до ресурсов приложения!

1 голос
/ 17 августа 2011

Нет хитрости в связывании дочернего окна со статической моделью представления с использованием шаблона локатора.Я думаю, что ваш DataContext неверен.

Проверка: убедитесь, что в вашем классе локатора определено свойство «AddAlert».Что-то вроде:

    private static AddAlertViewModel _AddAlertViewModel;

    /// <summary>
    /// Gets the ViewModelPropertyName property.
    /// </summary>
    public static AddAlertViewModel AddAlertViewModelStatic
    {
        get
        {
            if (_AddAlertViewModel == null)
            {
                CreateAddAlertViewModel();
            }

            return _AddAlertViewModel;
        }
    }

    /// <summary>
    /// THIS PROPERTY IS WHAT YOU NEED TO REFERENCE IN YOUR XAML
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "This non-static member is needed for data binding purposes.")]
    public AddAlertViewModel AddAlert
    {
        get
        {
            return AddAlertViewModelStatic;
        }
    }

И, конечно же, убедитесь, что ваш локатор модели представления создан в вашем файле App.xaml:

  <vm:MyModelLocator xmlns:vm="clr-namespace:MyAppNamespace" x:Key="Locator" />
...