1

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

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

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

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

在我的 C# 代码中,我从隔离存储中提取了一个列表。理想情况下,我想做的是让该列表中的所有人以一种格式良好的方式出现在 ListBox 中,然后在选择一个时,轻松地从 List<> 中检索 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 创建的有趣对象。有人可以告诉我我做错了什么,或者为我指出实现这一目标的好资源的方向吗?

非常感谢!

4

2 回答 2

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));
            }
        }
    }
}

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

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

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

瞧,您正在使用 MVVM 方法,而不是从后面的代码中填充视图。

另外,我建议不要滥用IsolatedStorageSettings存储应用程序的实际数据。为您的模型对象使用序列化程序,或使用 Windows Phone 的SQL 紧凑型数据库来执行此操作。

于 2012-06-25T15:57:45.100 回答
1

我还建议使用ObservableCollection<Person>而不是List<Person>. List 没有 ObservableCollection 那样的内置通知机制。

于 2012-06-25T17:21:28.207 回答