0

Prism、View First View Injection での MVVM の使用: モジュールにイメージを読み込めません

View First、View Injection パターンを使用して、MVVM パターンで WPF と Prism を使用しています。

私のソリューションには、BannerView.xaml で画像をバインドするだけの SG.BannerModule プロジェクトがあります。BannerViewModel を解決するためにコンテナーを使用しているため、IBannerViewModel を実装する以下の BannerViewModel を使用します。IBannerViewModel インターフェイスは次のとおりです。

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

インターフェイスを使用して、BannerMainModule のコンテナーを介して BannerViewModel を解決しているため、BannerImageUri を公開しました。

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 のデータ コンテキストを次のように設定しました。

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. パックウリが問題なのか。このモジュールを SG.WebSite プロジェクトのリージョンで使用しているため、パックの Uri が正しいかどうかはわかりませんが、シェル ウィンドウに画像が表示されない理由を正しくトラブルシューティングできませんでした。困った?

ありがとう!

4

1 に答える 1

0

ご存知のとおり、最初にViewModelを使用しているようです。ViewModelにビューを解決させてから、おそらくregion.Add(viewModel.View)を呼び出します。

これは、ローカルリソースファイルのpackURI構文です。

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

参照リソースファイルの場合:

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

于 2013-03-19T18:37:38.690 に答える