2009-11-25 136 views
1

我有一個場景,我加載一個數據網格ICollectionView。WPF datagrid多窗口問題

在某些情況下,我修改collectionview從中獲取數據的數據。例如,如果我以configGrid.ItemsSource = configData;重新加載網格,則數據會被更新。

現在的事情是,我有時用打開一個新窗口:

var newWindow = new Edit(movie); 
newWindow.Show(); 

的事情是,我也是用這個新窗口中編輯數據。現在,我想在關閉第二個窗口後刷新第一個窗口中的數據網格(實際上,它刷新時無關緊要,只要這樣做)。

我該怎麼做?

回答

1

我可能會錯過這裏的東西(不幸的是,我有一個殘缺的宿醉),但你不能處理newWindow窗口關閉事件並刷新confiGrids itemsource嗎?

Window newWindow = new Window(); 
newWindow.Closed += new EventHandler(newWindow_Closed); 
newWindow.Show(); 

void newWindow_Closed(object sender, EventArgs e) 
    { 
     configGrid.ItemsSource = configData; 
    } 
+0

這似乎不起作用,事件不會被觸發,如果我關閉新窗口 – WtFudgE

+0

哦。我不明白爲什麼上面的代碼不起作用 - 我只是將它打成了一個虛擬程序,事件得到了很好的提升。它看起來像你使用VB(我不熟悉),而不是C#,所以這可能是一個問題,我想(儘管我希望事件處理在兩種語言中都是相似的)。你是否有應該與打開或關閉窗口進行交互的代碼? – MoominTroll

+0

哦,我好像剛剛把代碼放在一個錯誤的窗口中:P 它工作正常,我很抱歉! 這不是vb btw :) – WtFudgE

0

如果ICollectionView背後的集合支持INotifyCollectionChanged(如ObservableCollection)和對象本身支持INotifyPropertyChanged那麼,網格應該自動更新

否則,你是你自己和編輯窗口應該提出一些排序的通知(可能是一個事件),您應該接收並更新列表。

好吧,這裏的長版本:

WPF數據綁定可以自動更新的用戶界面 - 但它需要知道的東西,爲了改變觸發更新,要做到這一點最簡單的方法是支持INotifyPropertyChanged的,讓我們創建簡單的類:

public class Movie 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
} 

現在,讓我們添加INotifyPropertyChanged的支持:

public class Movie : INotifyPropertyChanged 
{ 
    public event PropertyChanged; 

    protected virtual OnPropertyChanged(string property) 
    { 
     var ev = PropertyChanged; 
     if(ev!=null) 
     { 
      ev(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
} 

現在,當您綁定到MOVI e類並更改Name屬性,UI將自動更新。

下一步就是處理電影的對象列表,我們這樣做,通過使用集合類的工具INotifyCollectionChanged,幸運的是我們有已經寫入框架調用的ObservableCollection一個,你的用戶的ObservableCollection <牛逼>以同樣的方式你可以使用列表<T>。

所以,只需綁定到ObservableCollection,WPF將自動檢測對象何時更改或何時添加或刪除。

ICollectionView是非常有用的,它增加了對當前項目,排序,過濾,並在真實採集的頂部分組,如果該集合是一個ObservableCollection一切都將只是工作,所以代碼:

ObservableCollection<Movie> movies = new ObservableCollection<Movie>(); 
ICollectionView view = CollectionViewSource.GetDefaultView(movies); 

會給你一個支持自動更改通知的集合視圖。

+0

我對所有這些數據綁定技術並不是很熟悉,所以也許我應該使用其他方法而不是ICollectionView? – WtFudgE

+0

我已經更新了我的答案,包括了使用這些技術所需的所有詳細信息,希望這有助於您。 – Nir

+0

謝謝,它必須調整一下,但我得到它的工作:) – WtFudgE