2013-03-31 114 views
0

我有一個ObservbleCollection綁定到列表框。將該集合作爲列表的ItemsSource後,我無法更新我的集合。如果我更新它,程序關閉(沒有任何崩潰)。綁定後ObservableCollection更新

驗證碼:
我有類:

class MyFile 
{ 
    String FileName {get; set;} 
    ImageSource Ico {get; set;} 
} 

然後運行在constractor代碼(InitializeComponents後)

ObservableCollection<MyFile> filesList = new ObservableCollection<MyFile>(); 
filesList.Add(new MyFile { Name = "bar.doc", Ico = null } // Work Fine 
filesList.Add(new MyFile { Name = "foo.txt", Ico = null } // Work Fine 
files.ItemsSource = filesList; 
filesList.Add(new MyFile { Name = "try.txt", Ico = null } // EXIT FROM PROGRAM 

什麼是錯在我的計劃?

編輯
只是空測試它,而不是調用getIcon

+0

的背後,你能否告訴了'GetIcon'方法? –

+0

它非常複雜,我從互聯網上得到它。如果我將把空值,而不是程序行爲相同 – nrofis

+0

這很奇怪,「文件」的類型是什麼? –

回答

0

ObservableCollection的使命是要宣佈改變(添加,刪除,...)給聽者。因此,ObservableCollection沒有什麼問題,並將其作爲ListBox的ItemsSource進行綁定,不會使其不可編輯。現在一定是錯的GetIcon方法(例如,嘗試重新打開這是不正確關閉相同的圖像)

要看看這個思路是正確的嘗試:

ObservableCollection<MyFile> filesList = new ObservableCollection<MyFile>(); 
filesList.Add(new MyFile { Name = "bar.doc", Ico = GetIcon(".doc") } 
//filesList.Add(new MyFile { Name = "foo.txt", Ico = GetIcon(".txt") } // Comment this line 
files.ItemsSource = filesList; 
filesList.Add(new MyFile { Name = "try.txt", Ico = GetIcon(".txt") } 

如果你想看到的錯誤。我建議你在按鈕的單擊事件中(而不是在構造函數中)複製這些行,然後運行你的應用程序。

+0

對不起,不行。即使我把null改爲GetIcon – nrofis

+0

你在窗口的某個地方顯示'Ico'嗎? –

+0

是的,我有圖像和標籤的項目模板。 – nrofis

0

以下是使用DependencyPropery綁定ObservableCollection的小示例。我希望它能幫助你如何以這種方式進行DataBinding。

XAML

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     x:Name="MyWindow" 

     Title="MainWindow"> 
    <Grid> 
     <ListBox ItemsSource="{Binding MyList, ElementName=MyWindow, Mode=TwoWay}"> 
     </ListBox> 
    </Grid> 
</Window> 

代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Threading; 

using System.Collections.ObjectModel; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Logica di interazione per MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<string>), typeof(MainWindow)); 

     public ObservableCollection<string> MyList 
     { 
      get 
      { 
       return (ObservableCollection<string>)GetValue(MyListProperty); 
      } 
      set 
      { 
       SetValue(MyListProperty, value); 
      } 
     } 
     public MainWindow() 
     { 
      InitializeComponent(); 

      MyList = new ObservableCollection<string>() { "a", "b" }; 
      MyList.Add("c"); 
     } 
    } 
} 
+0

謝謝。我真正的'ObservableCollection'在另一個名爲'FilesManager'的類中管理所有文件和它的單例類。我仍然喜歡我的方式,但謝謝。 – nrofis

+0

請讓我知道你將如何擺脫這個問題,而不使用正確的綁定。看到一個挑戰WPF框架的人很有意思。 –

相關問題