繁体   English   中英

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

[英]How to bind the Image.Source in MVVM correctly?

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

  • X needs Y并且Y is available
  • X needs Y并且Y 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"/>

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

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

但是原本没有图像可供查看,也没有更改。

验证图像路径正确。 也许对图像进行硬编码以对其进行测试。

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

无法看到为什么它不起作用

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

我想念的是什么?

如果您确定视图的数据上下文包含活动的VM,则请确保VM上的StatusIconPath 属性报告属性更改事件

如此一来,绑定到它的XAML控件就知道它已更改,因此需要确保保存StatusIconPath的ViewModel遵循INotifyPropertyChanged ,这通常将促进此类操作:

private string _StatusIconPath;

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

我在博客上提供了更强大的示例,标题为:

Xaml:ViewModel主页实例化和加载策略,用于更轻松的绑定

事实证明,正如Kyle所说,我的ImagePath中还有多余的字符。 然后,我需要在Image.Source设置Image.Source 至少,这对我来说是这样的:

ViewModel是这样的:

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

然后在View.csSelectedItemChanged

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM