Установите App.xaml в UserControl WPF (для подключения локатора)

Ситуация:

В настоящее время я пытаюсь подключить мой DataContext к моему ViewModel, я использую GalaSoftMvvmLight,

Но дело в том, что у меня нет Window потому что я интегрирую этот код в другую программу, которая имеет Window, Так что у меня просто есть UserControl,

Проблема:

Я не знаю почему, но я не могу подключить DataContext в UserControl,

Я получаю эту ошибку {"Cannot find resource named 'Locator'. Resource names are case sensitive."}

Вопрос:

Как правильно подключить мои ресурсы App.xaml к моему View? И если это невозможно без Windowкак я могу позвонить DataContext с чем-то вроде этого

<UserControl.DataContext>
    SOMETHING TO SET DATACONTEXT WITH BINDING !
</UserControl.DataContext>

Вот мой код:

App.xaml

<Application x:Class="SOMETHING.App" xmlns:vm="clr-namespace:SOMETHING.ViewModel" StartupUri="ApplicationView.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <vm:ViewModelLocator x:Key="Locator" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

ApplicationView.xaml

<UserControl x:Class="SOMETHING.View.ApplicationView"
         <!-- THIS ONE DOESN'T WORK -->
         DataContext="{Binding ApplicationVM, Source={StaticResource Locator}}">

    <!-- THIS ONE DOESN'T WORK IF I SET <vm:ViewModelLocator x:Key="Locator" /> IN STYLE.XAML, BUT I CAN'T USE IT IN USERCONTROL PARAMETERS (LIKE ABOVE) -->
    <UserControl.Resources>
        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries >
                <ResourceDictionary Source="Style.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid>
         <Label Content="{Binding Title}" />
    </Grid>
</UserControl>

ViewModelLocator

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        }
        else
        {
            SimpleIoc.Default.Register<IDataService, DataService>();
        }

        SimpleIoc.Default.Register<ApplicationViewModel>();
    }

    public ApplicationViewModel ApplicationVM
    {
        get { return SimpleIoc.Default.GetInstance<ApplicationViewModel>();
    }
}

1 ответ

Решение

При условии, что ViewModelLocator класс и UserControl находиться в том же проекте / сборке, вы можете определить ViewModelLocator ресурс в ResourceDictionary что вы сливаетесь с UserControl как это:

<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Global.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <UserControl.DataContext>
        <Binding Path="ApplicationVM" Source="{StaticResource Locator}" />
    </UserControl.DataContext>
    <Grid>

    </Grid>
</UserControl>

Global.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfControlLibrary1">
    <local:ViewModelLocator x:Key="Locator" />
</ResourceDictionary>
Другие вопросы по тегам