C# 如何在MVVM中正确绑定Image.Source?

C# 如何在MVVM中正确绑定Image.Source?,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我现在花了一些时间试图解决这个问题,但我仍然坚持下去。我有一个带有MVVM模式的WPF应用程序。在我的ViewModel中,有三种情况: X需要Y并且Y可用 X需要Y并且Y不可用 X不需要Y 我正试图根据这些条件在我的视图上设置一个图像图标(比如复选标记、感叹号……等等) 在ViewModel中: 我创建了我的属性。在任何GUI更改中,我根据上述情况设置变量,类似于以下内容: void MyBigFunctionToSetAllProperties() { // other cases

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

  • X需要Y
    并且
    Y可用
  • X需要Y
    并且
    Y不可用
  • X不需要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>
if (Whatever)
{
    StatusIconPath = "/Resources/SessionView/X-With-Green-Check-White.png";
    ResultIconPath = "/Resources/SessionView/Y-White.png";
}
。但没有最初要查看的图像,也没有更改

验证图像的路径是否正确。也许硬编码一个图像来测试控件

另一种情况是,没有复制资源以进行运行时采集。确保它们在运行时实际可用

不明白为什么它不起作用

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

我错过的东西是什么

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

这是因为绑定到它的XAML控件知道它已更改,因此需要相应地确保保存
StatusIconPath
的ViewModel符合
INotifyPropertyChanged
,这通常将促进此类操作:

private string _StatusIconPath;

public string StatusIconPath 
{
   get { return _StatusIconPath; }
   set
       {
       _StatusIconPath = value;
       PropertyChanged("StatusIconPath");
       }
}
我在我的博客上提供了更有力的例子,标题为:


图标路径中有一大堆不必要的字符:

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";

事实证明,正如凯尔所说,我的ImagePath中有一个额外的不需要的字符。然后,我需要在我的视图.cs中设置我的
Image.Source
。至少,这对我来说是有效的:

ViewModel类似以下内容:

<StackPanel>
     <Image Source="{Binding StatusIconPath} />
</StackPanel>
if (Whatever)
{
    StatusIconPath = "/Resources/SessionView/X-With-Green-Check-White.png";
    ResultIconPath = "/Resources/SessionView/Y-White.png";
}
然后在View.cs中,在
上选择EditemChanged

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中:只是一个回退值(我们想要的任何原始/默认图像)。例:



视图模型类是否实现了
INotifyPropertyChanged
,以及
StatusIconPath的Setter是否正确地提升了
PropertyChanged
?@brad我对文本块绑定使用了相同的描述例程,它正在工作,只是对图像不起作用。你能看一下作业编辑吗?谢谢当绑定发生时,您是否在Visual Studio的输出窗口中看到任何绑定错误?我还要验证图像是否作为资源正确嵌入,以及您使用的资源路径是否正确。有时候这些在WPF中看起来很奇怪。请参阅本页,了解如何通过WPF中的路径引用资源的一些示例。您可能会得到一条类似
pack://application:,,,/ResourceFile.png
@brad我添加了我的输出。很有趣,谢谢。我正在挖掘更多我不认为这是问题所在,因为它正在使用文本块绑定。你能看一下作业编辑吗?thanks@FirstStep我更新了我的答案…听起来图像位置可能无法解析。图像文件位于解决方案的资源中,我在文件夹资源管理器中看到它们。仍然不起作用。如果你能分析的话,我添加了我的输出。我还在挖now@FirstStep看起来不是资源没有被复制(用于运行时),就是文件的路径错误。如果您想编辑并反映这一点,我已经让它工作了。感谢您的帮助使用完整资源文件包URI,如
“pack://application:,,,/Resources/SessionView/Y-White.png“
,并确保图像文件的构建操作设置为
Resource
@Clemens。虽然完整包URI可能更安全,但我在测试项目中测试了本地字符串,与OP一样,没有问题。只要它在同一个组件中就可以了。这是正确的,凯尔。但是,我需要设置我的
Image.Source=new-BitMapImage(新Uri(@WhateverThisPathIs,UriKind.Relative))在my View.cs中。我将编辑我的OP以包含它,并且路径在一开始就需要一个
/
。像这样:
“/Resources/…”
@FirstStep我不知道为什么会这样。我完全按照这里的方法测试了这个解决方案,它工作得很好,没有前导斜杠,也没有显式地创建
ImageSource
(这让我感到惊讶,我认为绑定引擎不会执行特定的转换)。