MVVMLight в другом проекте MVVMLight

Я работаю над проектом MVVMLight / WPF и мне нужно добавить функциональность, которая будет включать несколько представлений и моделей представления. Я знаю, что эта же функциональность будет использоваться в других проектах в ближайшем будущем, поэтому я хотел бы сделать эту функциональность своим собственным проектом, который я могу добавлять к другим решениям по мере необходимости без каких-либо изменений или без изменений.

Я начал с добавления второго проекта MVVMLight (бета-версия), удалив стандартные файлы MainWindow.xaml и MainViewModel.cs, и создал простой UserControl и связанную с ним модель представления.

<UserControl x:Class="Beta.View.TestView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ignore="http://www.ignore.com"
        mc:Ignorable="d ignore"
        DataContext="{Binding Test_VM, Source={StaticResource Locator} }">

    <Grid>
        <TextBlock Text="{Binding WelcomeMessage}" />
    </Grid>
</UserControl>



public class TestViewModel : ViewModelBase
{
    #region Properties

    public string WelcomeMessage
    {
        get
        {
            return "Hello World!";
        }
    }

    #endregion Properties

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the TestViewModel class.
    /// </summary>
    public TestViewModel()
    {

    }

    #endregion Constructors
}

Я могу добавить Beta в качестве ссылки на исходный проект (Alpha) и отобразить представление, вставив представление в панель стека следующим образом:

<StackPanel Name="MasterStackPanel"
            DockPanel.Dock="Top">
    <beta:TestView />
</StackPanel>

Все, кажется, работает должным образом, делая это. У меня возникает проблема, когда я пытаюсь привязать свойство из TestViewModel к TestView.

В TestView, если я делаю это:

<TextBlock Text="Hello World" />

TestView отображается правильно во время выполнения. Но когда я привязываю TextBlock к свойству следующим образом:

<TextBlock Text="{Binding WelcomeMessage}" />

Сообщение не отображается, и локатор для бета-версии, похоже, игнорируется (текстовый текст не привязан), и я получаю следующую ошибку от Snoop:

System.Windows.Data Error: 40 : BindingExpression path error: 'WelcomeMessage' property not found on 'object' ''MainViewModel' (HashCode=51013215)'. BindingExpression:Path=WelcomeMessage; DataItem='MainViewModel' (HashCode=51013215); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Test_VM' property not found on 'object' ''ViewModelLocator' (HashCode=22749765)'. BindingExpression:Path=Test_VM; DataItem='ViewModelLocator' (HashCode=22749765); target element is 'TestView' (Name=''); target property is 'DataContext' (type 'Object')

Я считаю, что это означает, что привязку Test_VM & WelcomeMessage пытаются найти через альфа-локатор, а не бета-локатор. Я использую ViewModelLocator, который создается по умолчанию при запуске проекта MVVMLight в каждом проекте.

Возможно ли иметь второй "Локатор" и если да, что мне нужно сделать, чтобы он работал?

1 ответ

Я думаю, что у вас должен быть только один локатор в корне приложения системы и использовать библиотеку "MvvmLightLibs" в проекте библиотеки, ссылаться на нее в альфа-проекте и добавлять свойство TestViewModel-в локатор.

Другие вопросы по тегам