2010-10-21 105 views
0

我正在使用一個ScatterView,我目前綁定到一個文件夾,以便當我的應用程序啓動時顯示一些示例圖像,這很好。WPF ScatterView綁定到多個來源

<s:ScatterView x:Name="MainScatterView"> 
     <s:ScatterView.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding}"/> 
      </DataTemplate> 
     </s:ScatterView.ItemTemplate> 
    </s:ScatterView> 

然後我設置綁定使用

scatter.ItemsSource = 
       System.IO.Directory.GetFiles(imagesPath, "*.jpg"); 

這個偉大的工程,但後來當我嘗試添加更多圖片:

Image img = new Image(); 
     img.Source = 
      new BitmapImage(new Uri("\\Resources\\Koala.jpg", UriKind.Relative)); 
     scatter.Items.Add(img); 

我得到一個InvalidOperationException:操作無效時的ItemSource是正在使用。

處理這個問題的最佳方法是什麼?刪除綁定並在啓動時手動添加圖像?我假設那麼因爲ItemSource是相同的任何進一步添加不會導致任何問題?還是有更好的方法來處理這個問題,因爲綁定方法非常好。

歡呼

回答

3

這需要一個ViewModel

這種類型的問題,結合了簡單的情況下工作良好,但由於開始添加場景跌下來,是一個很好的指標,它的時間使用Model - View - ViewModel

粗略地說,這個想法是你有一個View(你的XAML)和一個Model(你的數據,在這個例子中是一組文件)。但不是直接將視圖綁定到數據,而是添加一個名爲ViewModel的中間類。您的視圖綁定到ViewModel,並且您的ViewModel從模型中加載它自己。當你加載數據被綁定時,這會給你擺脫空間做比簡單的事情更多的事情。

這是什麼意思?它看起來像:

public class MainViewModel 
{ 
    // ObservableCollection adds databinding goodness so when you add a new file, 
    // the UI automatically refreshes 
    public ObservableCollection<string> Images { get; private set; } 

    public MainViewModel(string path) 
    { 
     Images = new ObservableCollection<string>(); 
     Images.AddRange(Directory.GetFiles(path, "*.jpg")); 
    } 

    public void AddImage(string path) 
    { 
     Images.Add(path); 
    } 
} 

現在在您的xaml中,您將您的datacontext設置爲新的MainViewModel。你可以在代碼後面或使用StaticResource來做到這一點,如果你使用StaticResource,你需要一個不帶參數的ctor,所以你必須以其他方式設置你的初始目錄。您的綁定然後看起來像:

<Image Source={Binding Images} /> 

仔細看看M-V-VM模式。您會發現它使數據綁定問題更容易,並且還具有其他一些好處,如更少的事件處理程序(更少的引用泄漏),更好的可測試性,更易於使用Blend以及更容易添加新類型的UI技術。

0

我也是新界面開發,反正我有的是刪除數據綁定,並通過手動添加圖片循環。