2016-01-05 122 views
1

也許愚蠢的問題,但我不知道了......WPF綁定圖片來源

我ViewModel類是這樣的:

public class MainWindowsViewModel : INotifyPropertyChanged 
{ 
    private ImageSource _img; 
    public ImageSource StatusImage 
    { 
     get { return _img; } 
     set 
     { 
      _img = value; 
      NotifyPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName]String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

在XAML綁定是這樣的:

<Window.DataContext> 
    <VM:MainWindowsViewModel /> 
    </Window.DataContext> 
    <Image x:Name="gui_image_status" HorizontalAlignment="Left" Height="26" Margin="144,10,0,0" VerticalAlignment="Top" Width="29" Source="{Binding Path=StatusImage}" /> 

我這樣設置的ImageSource的內容:

MainWindowsViewModel _view = new MainWindowsViewModel(); 

     var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative)); 
     _view.StatusImage = yourImage; 

但它不起作用。我認爲那個問題在於NotifyPropertyChanged,因爲我在setget中試過了制動點。 Get在開始時觸發了幾次,然後set以正確的ImageSource觸發,但之後get沒有再觸發。就像沒有發生過任何設定。

這真的是簡單的約束,我已經做了很多次類似的......我不知道爲什麼這次不工作。

回答

3

你創建你的MainWindowsViewModel類,一個在XAML的兩個實例背後通過

MainWindowsViewModel _view = new MainWindowsViewModel(); 

所以後面的代碼上設置一個比視圖綁定到不同的視圖模型實例的屬性。

更改代碼後面這一點:

var viewModel = (MainWindowsViewModel)DataContext; 
viewModel.StatusImage = new BitmapImage(...); 
+0

我認爲這只是一個例子,但不是真正的代碼。我希望。 –

+0

你的意思是這個問題?這確實是真實的代碼,也是一個常見的錯誤。我在StackOverflow上經常看到這一點。 – Clemens

+0

應該像'Application.Current.MainWindow.DataContext'一樣工作,但最好不要在XAML中創建視圖模型實例,而是在您的代碼後面創建一個全局可訪問的實例,即在App類中。 – Clemens

-1

我沒有在你的代碼中發現任何問題,但你可以嘗試檢查一些東西。

  1. 檢查您的圖像是否添加到項目中,並將圖像的構建操作設置爲內容(如果更新,則複製)。
  2. 在進行更新之前ImageSource的通話冷凍方法,以防止錯誤:

    var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative)); 
    yourImage.Freeze(); 
    _view.StatusImage = yourImage; 
    

此外,還有綁定在WPF圖像更簡單的方式「必須在同一個線程中的DependencyObject創建DependencySource」。您可以使用字符串作爲源,並設置一個資源路徑的綁定屬性:由

<Window.DataContext> 
    <VM:MainWindowsViewModel /> 
</Window.DataContext> 

,一個在代碼

public string StatusImage 
{ 
    get { return "/AssemblyName;component/Sources/red.png"; } 
}