如何正确绑定MVVM中的Image.Source?

时间:2016-05-25 19:21:53

标签: c# wpf mvvm binding

我花了一些时间试图解决这个问题,但我仍然坚持下去。我有一个带MVVM模式的WPF应用程序。在我的ViewModel中,我有三种情况:

  • X needs YY is available
  • X needs YY is not available
  • X doesn't need Y

我正在尝试根据这些条件在我的视图上设置图像图标(如复选标记,感叹号......等等)。

在ViewModel中: 我创建了我的属性。在任何GUI更改时,我根据上述情况设置变量,类似于以下内容:

void MyBigFunctionToSetAllProperties()
{
   // other cases
   // ..
   if (NeedsY && YExists)
    {
        // properties
        StatusIconPath = "@\"/Resources/SessionView/X-With-Green-Check-White.png\"";
        ResultIconPath = "@\"/Resources/SessionView/Y-White.png\"";
    }
}

View.Cs 中:我确实没有。

View.xaml:中,我这样绑定:

<StackPanel>
     <Image Source="{Binding StatusIconPath} />
</StackPanel>

我仍然不明白为什么它不起作用。我错过了什么?拜托,谢谢。

根据建议,不能直接将属性绑定到Xaml。我这样试过:

VM:示例属性:

public BitmapImage VerificationStatusIcon{ get { return new BitmapImage(new Uri(@VerificationStatusIconPath, UriKind.Relative));}}

查看Xaml

<Image Name="verificationStatusImage" Source="{Binding VerificationStatusIcon}" Margin="5,0" Width="40" Height="40"/>

3 个答案:

答案 0 :(得分:2)

你的图标路径中有很多不必要的字符:

StatusIconPath = "@\"/Resources/SessionView/X-With-Green-Check-White.png\"";
ResultIconPath = "@\"/Resources/SessionView/Y-White.png\"";

将它们更改为:

StatusIconPath = "Resources/SessionView/X-With-Green-Check-White.png";
ResultIconPath = "Resources/SessionView/Y-White.png";

答案 1 :(得分:1)

  

。但是没有图像最初可以查看而且没有变化..

验证图像的路径是否正确。也许硬编码图像来测试对它的控制。

另一种情况是资源不会被复制用于运行时获取。确保它们在运行时实际可用。

  

无法理解为什么它不起作用

主视图的DataContext是否设置为实时VM的实例?

  

我错过了什么?

如果您确定视图的datacontext包含实时VM,请确保VM上的属性StatusIconPath报告属性更改事件

这样,绑定到它的XAML控件知道它已更改,相应地需要确保持有StatusIconPath 的ViewModel 遵守INotifyPropertyChanged这将有助于这样的操作:

private string _StatusIconPath;

public string StatusIconPath 
{
   get { return _StatusIconPath; }
   set
       {
       _StatusIconPath = value;
       PropertyChanged("StatusIconPath");
       }
}

我在我的博客上提供了更强大的例子:

Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

答案 2 :(得分:0)

事实证明,我在 ImagePaths 中有一个额外不需要的字符,正如凯尔所说。然后,我需要在 View.cs 中设置Image.Source。至少,这是它对我有用的方式:

ViewModel 这样的事情:

if (Whatever)
{
    StatusIconPath = "/Resources/SessionView/X-With-Green-Check-White.png";
    ResultIconPath = "/Resources/SessionView/Y-White.png";
}

然后在 View.cs SelectedItemChanged上:

private void Grid_SelectedItemChanged(object sender, DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e)
{
    string tempStatus = ((SessionViewModel) DataContext).StatusIconPath;
    string tempResult = ((SessionViewModel) DataContext).ResultIconPath;
    StatusImage.Source = new BitmapImage(new Uri(@tempStatus, UriKind.Relative));
    ResultImage.Source = new BitmapImage(new Uri(@tempResult, UriKind.Relative));
}

并在 Xaml:中只是一个后备值(我们想要的任何原始/默认图像)。例如:

<Image Name="ResultImage" Source="/EZ3D;component/Resources/SessionView/Retake-White.png"/>