2012-06-25 33 views
1

我一直在嘗試使用列表框中的一個Model.Person的列表<>,使用ItemTemplate的樣式,然後檢索從列表中選擇正確的Model.Person。我到處尋找示例代碼(並嘗試過引導數據綁定,但仍無法正確理解它)。正確的方式來使用列表框(與ItemTemplate)當使用列表<>

List<Model.Person> people = (comes from IsolatedStorageSettings) 

在頁面上我有一個名爲「列表」的列表框。

<ListBox Name="List"></ListBox> 

在我的C#代碼中,我從孤立存儲中取出一個List。我想要做的最好的事情是,列表中的所有人都以良好的格式顯示在列表框中,然後在選擇列表框時,輕鬆地從列表<>中檢索人員。 我在做什麼,在那一刻,什麼肯定是錯的:

foreach (Model.Person person in people) 
{ 
    List.Items.Add(person.firstName + " " + person.lastName); 
} 

然後,當選擇了一個項目,我發現使用這種方法的人:

string selectedPerson = List.SelectedItem.ToString(); 
Model.Person person = people.Where(X => X.firstName + " " + X.lastName == selectedPerson).FirstOrDefault(); 

顯然,清單在這個項目中,它只是作爲純文本出現,而不是像使用ItemTemplate創建的感興趣的對象。有人能告訴我我做錯了什麼,或者指出我爲實現這一目標提供了一個好的資源?

非常感謝!

回答

3

你真的想在視圖中查看相關的東西,而不是在後面的代碼中。因此,不要用代碼手動填充列表,而是在視圖中綁定它。在XAML可能看起來是這樣的:

<ListBox ItemsSource="{Binding Path=People}" SelectedItem="{Binding Path=SelectedPerson, Mode=TwoWay}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=FirstName}" /> 
       <TextBlock Text="{Binding Path=LastName}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

使用透明的結構視圖模型爲您的網頁,與成員People和一個用於選定的人。它看起來是這樣的:

public class YourPageViewModel : INotifyPropertyChanged 
{ 
    public List<Model.Person> People { get; set; } 

    private Model.Person _selectedPerson; 
    public Model.Person SelectedPerson 
    { 
     get 
     { 
      return _selectedPerson; 
     } 
     set 
     { 
      if (_selectedPerson != value) 
      { 
       _selectedPerson = value; 
       PropertyChangedEventHandler handler = this.PropertyChanged; 
       if (handler != null) 
        handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

然後設置視圖模型代碼視圖的背後:

public partial class MainPage : PhoneApplicationPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     this.Loaded += (s, e) => 
     { 
      if (DataContext == null) 
       DataContext = new YourPageViewModel(); 
     }; 
    } 
} 

的Et瞧,您使用的是MVVM的做法,而不是填充從代碼視圖背後。

此外,我建議不要濫用IsolatedStorageSettings來存儲應用程序的實際數據。爲模型對象使用序列化程序,或者使用Windows Phone的SQL compact數據庫來完成此操作。

+0

真棒,這工作的魅力。你可能會推薦一個關於串行器如何工作的資源以及如何使用它?我嘗試使用SQL數據庫,並有一個絕對的噩夢。 – Dwight

+1

@ user1125910:這裏http://www.eugenedotnet.com/2010/12/windows-phone-7-serialization-comparison/是關於不同(內置和自定義)序列化器的運行時和文件大小的比較。這一切都取決於您的應用程序的具體要求。 –

+1

@ user1125910:對於我上一個項目,我使用了以下的二進制序列化器:http://whydoidoit.com/2011/08/05/silverlightserializer-version-2/ –

1

我也推薦使用ObservableCollection<Person>而不是List<Person>。 List沒有像ObservableCollection一樣的內置通知機制。

相關問題