簡體   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