2013-04-29 51 views
1

我想將一個人員列表綁定到一個DataGrid控件。 對象按需加載,這意味着初始狀態下我只有一個ID列表(int)。在DataGrid本身中,我需要具有所有屬性的對象(Person類型)。如何正確使用ItemsSource點播?

爲此,我使用了一個IValueConverter將我的List<int>轉換爲List<Person>。 我想將SelectedItem綁定到屬性int SelectedId。我不能簡單地綁定到Person,因爲我的Person類沒有ID屬性。但是通過值轉換,SelectedItem顯然是Person類型的。

我應該最初加載的對象在Dictionary代替並結合其到的ItemsSource。 SelectedItem將會是一個KeyValuePair。

還有其他方法可行嗎?

+0

*爲此,我使用了一個IValueConverter將List轉換爲List * - Uhm wOot?您可以添加一些代碼,以便我們獲得更多詳細信息嗎?關於你的問題,你的方法是否奏效?或者你有特定的問題嗎? – DHN 2013-04-29 10:13:11

+0

你不能使用懶惰?請參閱http://msdn.microsoft.com/en-GB/library/vstudio/dd642331.aspx – SvenG 2013-04-29 11:40:25

+0

@DHN對不起,我忘了應用代碼格式。現在我使用'Dictionary '作爲ItemsSource和'KeyValuePair '作爲SelectedItem。這種方法是有效的,但我不確定這是否是常見的做法 – mamuesstack 2013-04-29 12:00:21

回答

0

恕我直言,在列表中提供數據的最佳方式,是一個ObservableCollecion<T>。我確信這也是常見的方式,但我沒有資料證明它。所以這是一個恕我直言的聲明。

它實現了INotifyCollectionChanged接口,使得該視圖注意到任何更改(添加和移除項目)。欲瞭解更多信息,請參閱here。如果集合中的項目(在您的案例Person中)正在實施INotifyPropertyChanged,則該視圖也會通知有關項目本身的更改。請查看here瞭解更多信息。

因此,如果我在哪裏,我會將一個id屬性放入Person並將整個集合加載到ObservableCollection。如果你不能修改Person您就可以創建

public class PersonVm 
{ 
    public int Id { get; set; } 
    public Person Person { get; set; } 

    public PersonVm(int id, Person person) 
    { 
     Id = id; 
     Person = person; 
    } 
} 

的包裝你將不得不自行增加的INotifyPropertyChanged實施,如果你想擁有的物品的通知功能。

順便說一句,我在這裏描述的是MVVM模式的典型實現。它具有實現WPF應用程序的許多優點,但也有一些缺點。例如。有一個開銷可能不值得在較小的項目中付出努力。您可以獲得概述here

+0

我比較喜歡這個解決方案,因爲它遵循常見的MVVM模式。開銷是可管理的,因爲ViewModel只是一個包裝。 – mamuesstack 2013-04-29 13:19:23