PRISM(Unity)中的ViewModelLocator在模块中不起作用

本文关键字:模块 不起作用 ViewModelLocator 中的 Unity PRISM | 更新日期: 2024-10-24 11:11:40

我正在学习Brian Lagunas的教程,有一个问题。

我们有一个小的应用程序设置与PRISM 6和Unity引导程序。我想使用ViewModelLocatorViewModel绑定到我的视图。这在"基本模块"(带有Shell和引导程序的模块)中有效,但在其他模块中使用它时似乎存在一些问题。

下面可以找到View(XAML和代码隐藏)和ViewModel的类。如果我手动在代码后面设置DataContext,那么绑定就可以工作。在调试代码时,我发现ViewModel类从未实例化,所以我猜VML由于配置错误而找不到VM。但据我所见,命名约定已得到满足。

你能找到问题吗?或者知道我忘记了什么配置吗?

视图(代码隐藏):

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;
        }
    }
}

PRISM(Unity)中的ViewModelLocator在模块中不起作用

不能让用户控件的名称以View结尾,如果这样做,AutoWireViewModel将不起作用。因此,请将您的用户控件名称更改为Communication,将视图模型名称更改为CommunicationViewModel