ViewModelLocator в PRISM (Unity) не работает в модулях

Я следую учебнику Брайана Лагунаса и у меня есть вопрос.

У нас есть небольшая настройка приложения с PRISM 6 и загрузчиком Unity. Я хочу использовать ViewModelLocator связать ViewModel на мой взгляд. Это работает в "базовом модуле" (тот, что с Shell и загрузчиком), но кажется, что есть некоторые проблемы при использовании его в других модулях.

Ниже вы можете найти классы для View (XAML и код позади) и для ViewModel, Привязка работает, если я установлю DataContext в коде позади вручную. во время отладки кода я обнаружил, что ViewModel класс никогда не создается, так что я думаю, VML не может найти виртуальную машину из-за неправильной конфигурации. Но, насколько я вижу, соглашения об именах выполнены.

Вы можете найти проблему или иметь представление, какую конфигурацию я забыл?

Вид (код сзади):

namespace CommunicationModule.Views
{
    public partial class CommunicationView : UserControl, IView
    { 
            public CommunicationView()
            {
                InitializeComponent();
            }     
        }
}

Посмотреть XAML:

  <UserControl
     x:Class="CommunicationModule.Views.CommunicationView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:View="clr-namespace:CommunicationModule.Views"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid DataContext="{Binding ModelList, UpdateSourceTrigger=PropertyChanged}" Width="320" Height="300">
        <Grid.Resources>
            <DataTemplate x:Key="DataTemplate">
                <Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2" 
                 CornerRadius="2" Padding="5" Margin="5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MaxWidth="30"/>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Image Grid.Row="0" Grid.Column="0" Source="{Binding Path=IconUri}" HorizontalAlignment="Left" />
                        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=Title}" FontSize="12" FontWeight="Bold" />
                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=ContentShort}"/>
                    </Grid>
                </Border>
            </DataTemplate>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <!-- UI -->

        <DockPanel Grid.ColumnSpan="2" Margin="0,0,10,0">
            <!-- Title -->
            <Label DockPanel.Dock="Top" FontSize="18" Margin="5" Content="Wichtige Meldungen"/>

            <!-- Data template is specified by the ItemTemplate attribute -->
            <ScrollViewer>
                <ListBox Name="listBox"
            SelectionMode="Single"
            ItemsSource="{Binding}" 
            ItemTemplate="{StaticResource DataTemplate}" 
            HorizontalContentAlignment="Stretch" 
            IsSynchronizedWithCurrentItem="True" 
            Margin="5,0,5,5" Width="280"/>
            </ScrollViewer>
        </DockPanel>
    </Grid>
</UserControl>

ViewModel:

namespace CommunicationModule.ViewModels
{
    public class CommunicationViewViewModel : BindableBase
    {
        private List<CommunicationModel> _modelList = (new CommunicationModelBO()).getCommunicationItems(); //= new List<CommunicationModel>();
        private readonly IRegionManager _regionManager;

        public List<CommunicationModel> ModelList
        {
            get { return _modelList; }
            set { SetProperty<List<CommunicationModel>>(ref _modelList, value); }
        }

        public CommunicationViewViewModel(IRegionManager regionManager)
        {
          _regionManager = regionManager;
        }
    }
}

0 ответов

Вы не можете позволить имени вашего пользовательского элемента управления заканчиваться на View, если вы это сделаете, AutoWireViewModelне сработает. Поэтому, пожалуйста, измените имя своего пользовательского элемента управления наCommunication и имя модели просмотра CommunicationViewModel.

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