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