将ImageSource绑定到MVVM的第二级

时间:2017-01-05 06:42:50

标签: c# wpf mvvm data-binding prism

以下ViewModel代码加载图像,然后将其设置为AppBackground属性:

public class ShellViewModel : BindableBase
{
    public ShellViewModel()
    {
        var Stream = Assembly.GetExecutingAssembly()
            .GetManifestResourceStream("Application.Resources.Images.Background.jpg");
        var bi = new BitmapImage();
        bi.BeginInit();
        bi.StreamSource = Stream;
        bi.CacheOption = BitmapCacheOption.OnLoad;
        bi.EndInit();
        AppBackground = bi;
    }

    public ImageSource AppBackground
    {
        get { return _AppBackground; }
        set { SetProperty(ref _AppBackground, value); }
    }
    ImageSource _AppBackground;
}

只需添加此命令,图像就会正确显示:

<Grid>
    <Grid.Background>
        <ImageBrush ImageSource="{Binding AppBackground}" />
    </Grid.Background>
    ...
</Grid>

问题

现在,我希望将图像封装在类中,例如Settings,然后通过接口ISettings传递它,然后使用MEF导出它并将其导入到viewmodel中:< / p>

public class ShellViewModel : BindableBase
{
    [Import]
    public ISettings Settings
    {
        get { return _Settings; }
        set { SetProperty(ref _Settings, value); }
    }
    ISettings _Settings;
}

图像加载在Settings类中完成:

public class Settings : BindableBase, ISettings
{
    public Settings()
    {
        var Stream = Assembly.GetExecutingAssembly()
            .GetManifestResourceStream("Application.Resources.Images.Background.jpg");
        var bi = new BitmapImage();
        bi.BeginInit();
        bi.StreamSource = Stream;
        bi.CacheOption = BitmapCacheOption.OnLoad;
        bi.EndInit();
        AppBackground = bi;
    }

    public ImageSource AppBackground
    {
        get { return _AppBackground; }
        set { SetProperty(ref _AppBackground, value); }
    }
    ImageSource _AppBackground;
}

ISettings接口的定义是:

[InheritedExport(typeof(ISettings))]
public interface ISettings
{
    ImageSource AppBackground { set; get; }
}

最后,通过更改xaml代码:

<Grid>
    <Grid.Background>
        <ImageBrush ImageSource="{Binding Settings.AppBackground}" />
    </Grid.Background>
    ...
</Grid>

不显示图像。

我已经尝试了什么

  • 我使用调试器检查了导出导入是否正确。
  • 我使用调试器检查了图像是否已正确加载。
  • 我确认绑定已正确完成,检查返回的消息:
  

System.Windows.Media.Imaging.BitmapImage

当我在同一视图中添加以下代码时:

<TextBlock Text="{Binding Settings.AppBackground}" />
  • 我将属性类型更改为另一个(如double或string),{Binding Settings.AppBackground}路径按原样运行。

我怀疑

  • 我忽略了基本的约束力问题。
  • 我忽略了绑定到ImageSource类型的一些问题。
  • 我刚刚在WPF绑定系统中发现了一个错误。

我希望它不是真的最后一次。

所以,我的问题

  1. 你知道问题可能是什么吗?
  2. 还有哪种解决方案可以解决这个MVVM场景?

0 个答案:

没有答案