2013-10-03 37 views
0

在我的項目中,我有一個視圖,用戶可以看到ImageCollections具有子文件夾和圖像(通過MVVM和模型設置)。我想要實現的功能之一是一個小圖像保持器,其中顯示未看到的下一幅圖像。我已經在下面的ImageCollection模型中設置了它,它工作的一個治療但是:它不會實時更新。Model中的項目不會在實時查看中更新

我的意思是,當我單擊圖像作爲查看時,ShowNextToWatchImage圖像不會在視圖中自動更新(如果我退出應用程序並重新啓動它,或者重新打開時顯示正確的新圖像夾)。

我該如何解決這個問題?

在模型:

public Image ShowNextToWatchImage 
     { 
      get 
      { 
       var found = false; 
       Image nextToWatchImage = null; 
       foreach (var folder in Folders) 
       { 
        foreach (var image in folder.Images) 
        { 
         if (!image.ImageHasBeenViewed) 
         { 
          nextToWatchImage = image; 
          found = true; 
          break; 
         } 
         nextToWatchImage = image; 
        } 
        if (found) 
        { 
         break; 
        } 
       } 
       return nextToWatchImage; 
      } 
      set 
      { 
       _showNextToWatchImage = value; 
       NotifyOfPropertyChange(() => ShowNextToWatchImage); 
     } 
    } 

編輯:

試圖實現Sheridan的回答後,我有以下的(這我相信,我以某種方式balzed了),這給我什麼也沒有(或者至少在那個視圖中什麼也沒有顯示)

public class Collection : PropertyChangedBase 
    { 
     private Image _showNextToWatchImage; 

     public Collection() 
     { 
      Folders = new List<Folder>(); 
     } 

     public Image ShowNextToWatchImage 
     { 
      get { return _showNextToWatchImage; } 
      set 
      { 
       _showNextToWatchImage = value; 
       UpdateNextToWatchImage(); 
       NotifyOfPropertyChange(() => ShowNextToWatchImage); 
      } 
     } 

     public void UpdateNextToWatchImage() 
     { 
      var found = false; 
      Image nextToWatchImage = null; 
      foreach (var folder in Folders) 
      { 
       foreach (var image in folder.Images) 
       { 
        if (!image.ImageHasBeenViewed) 
        { 
         nextToWatchImage = image; 
         found = true; 
         break; 
        } 
        nextToWatchImage = image; 
       } 
       if (found) 
       { 
        break; 
       } 
      } 
      ShowNextToWatchImage = nextToWatchImage; 
     } 

     public List<Folder> Folders { get; set; } 
    } 
+1

嗨,也許你的問題不在ViewModel,但在視圖。你使用TwoWay BindMode嗎? –

+0

爲了通過視圖更新ViewModel(實時),您需要在View側指定TwoWay Binding,作爲@Piotr Czarnecki指出的。 –

+0

什麼是'folder.Images'?請給出定義。 – Dennis

回答

1

你需要加ca LL NotifyOfPropertyChange當值的變化,但是你實際上改變吸氣,而不是制定者的價值...嘗試創建一個名爲UpdateNextImage新方法,並把你的代碼,以確定下一Image在那裏,而不是:

public Image ShowNextToWatchImage 
{ 
    get 
    { 
     return _showNextToWatchImage; 
    } 
    set 
    { 
     _showNextToWatchImage = value; 
     UpdateNextImage(); 
     NotifyOfPropertyChange(() => ShowNextToWatchImage); 
    } 
} 

UPDATE >>>

我仍然不能100%確定你的設置(這是最好的,如果你能告訴我們所有您相關的代碼),但你說你要這樣對你時更新點擊一個Image。這讓我覺得你有一個點擊或Command處理程序。如果這是正確的,那麼我建議你把你的下一個選擇的功能在裏面,而不是:

private void Image_Click(object sender, RoutedEventArgs e) 
{ 
    ShowNextToWatchImage = GetNextImage(); 
} 

private Image GetNextImage() 
{ 
    var found = false; 
    Image nextToWatchImage = null; 
    foreach (var folder in Folders) 
    { 
     foreach (var image in folder.Images) 
     { 
      if (!image.ImageHasBeenViewed) 
      { 
       nextToWatchImage = image; 
       found = true; 
       break; 
      } 
      nextToWatchImage = image; 
     } 
     if (found) 
     { 
      break; 
     } 
    } 
    return nextToWatchImage;   
} 
+0

聽起來像更好的選擇,但我在哪裏放新的方法?在集合模型中,圖像模型還是在ViewModel中? – touyets

+0

在財產下面?必須從酒店進入。 – Sheridan

+0

我用你的建議更新了我原來的帖子,但是它在失敗。請你幫我看一下嗎? – touyets

0

你在你的XAML綁定設置mode=TwoWay?所以:{Binding ShowNextToWatchImage, Mode=TwoWay}

+0

是的,但我不想工作。我現在要嘗試一下工作,看看結果如何。 – touyets

+0

你可以切換這兩行:'_showNextToWatchImage = value; UpdateNextToWatchImage();'?你設置了'ShowNextToWatchImage'屬性,然後執行你再次**設置相同屬性的方法,這聽起來有點奇怪。 – Loetn

相關問題