使用List<>时使用ListBox(使用ItemTemplate)的正确方法

时间:2012-06-25 15:50:05

标签: c# .net windows-phone-7

我一直在尝试使用List<>我在ListBox中使用的Model.Person,使用ItemTemplate作为样式,然后在选择一个时从列表中检索正确的Model.Person。我到处寻找示例代码(并尝试了领先的数据绑定,但仍然无法正确理解它。)

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

在页面上我有一个ListBox,比如名为“List”。

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

在我的C#代码中,我从隔离存储中提取List。我理想的做法是让该列表中的所有人以一种很好的格式化方式出现在ListBox中,然后当选择一个时,可以轻松地从List&lt;&gt;中检索Person。 我现在在做什么,肯定是错的:

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创建的有趣对象。有人可以告诉我我做错了什么,或者指出了我实现这个目标的良好资源吗?

非常感谢!

2 个答案:

答案 0 :(得分: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>

为您的网页使用清晰的结构化ViewModel,其成员为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));
            }
        }
    }
}

然后在视图后面的代码中设置viewmodel:

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数据库来执行此操作。

答案 1 :(得分:1)

我还建议使用ObservableCollection<Person>代替List<Person>。 List没有像ObservableCollection那样的内置通知机制。