0

使用 Prism、MVVM 和 View First View Injection:无法在模块中加载图像

我正在使用 View First,View Injection 模式在 MVVM 模式中使用 WPF 和 Prism。

在我的解决方案中,我有一个 SG.BannerModule 项目,我只想在我的 BannerView.xaml 中绑定一个图像。我使用下面实现 IbannerViewModel 的 BannerViewModel,因为我使用容器来解析我的 BannerViewModel。这是 IbannerViewModel 接口:

public interface IBannerViewModel : IViewModel
{
    Uri BannerImageUri { get; set; }
}

我暴露了 BannerImageUri,因为我使用接口通过 BannerMainModule 中的容器解析 BannerViewModel。

BannerViewModel 实现是

public class BannerViewModel : ViewModelBase, IBannerViewModel
{

    #region Properties

    private IUnityContainer _container;
    private ILogger _logger;

    private Uri _bannerImageUri;
    public Uri BannerImageUri
    {
        get { return new Uri("pack://SG.Website:,,,SG.BannerModule;component/Assets/SGBanner2.png"); }
        set
        {
            if (value != _bannerImageUri)
            {
                _bannerImageUri = value;
                OnPropertyChanged("BannerImageUri");
            }

        }
    }

     #endregion

    #region Constructors

    public BannerViewModel(IBannerView bannerView, IUnityContainer container)
        : base(bannerView)
    {
        View = bannerView;
        View.ViewModel = this;

        _container = container;
        _logger = _container.Resolve<ILogger>();

        _logger.WriteToLogs("BannerViewModel Constructor");
    } 
    #endregion

 }

该图像位于我的 SG.BannerModule 项目的 Assets 目录中。我已将图像 SGBanner2.png 的构建属性设置为资源,并已将图像添加到 SG.BannerModule 项目的属性窗格的资源选项卡中。我在 BannerView.xaml.cs 文件中设置了 BannerView.xaml 的数据上下文,因为我使用的是 View Injection。

public partial class BannerView : UserControl, IBannerView
{
    public BannerView()
    {
        InitializeComponent();
    }

    public IViewModel ViewModel
    {
        get 
        { 
            return (IBannerViewModel) DataContext; 
        }
        set { DataContext = value; }
    }

}

由于 View First View Injection 模式,我在后面的代码中设置了 DataContext,并且没有在 XAML 中设置任何内容。

我的问题是

  1. 因为我正在绑定这个图像,我需要使用 ImageSource 转换器吗?如果是这种情况,是否会因为图像是 png 而不是位图而成为问题?
  2. 或者是Pack Uri的问题。因为我在我的 SG.WebSite 项目的一个区域中使用这个模块,所以我不确定我的包 Uri 是否正确,但我无法正确解决为什么我的图像没有显示在我的 shell 窗口中。难倒?

谢谢!

4

1 回答 1

0

如您所知,您似乎首先使用的是 ViewModel。让您的 ViewModel 解析您的 View,然后可能会调用 region.Add(viewModel.View)。

这是本地资源文件的 packURI 语法:

pack://application:,,,/Subfolder/ResourceFile.xaml

对于参考资源文件:

pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

于 2013-03-19T18:37:38.690 回答