【问题标题】:Lost in the listbox data binding迷失在列表框数据绑定中
【发布时间】:2011-10-02 12:39:12
【问题描述】:

我正在尝试做一些我认为非常简单的事情,但是.. 我创建了一个数据透视应用程序并在 MainPage.xaml 中插入了一个列表框

< ListBox x:Name = "partyList" Margin = "0,0,-12,0" > 
< ListBox.ItemTemplate > 
    < DataTemplate > 
        < StackPanel Orientation = "Horizontal" Margin = "0,0,0,17" > 
            < StackPanel Width = "311" > 
                < TextBlock Text = "{Binding throwLocation}" 
                           TextWrapping = "Wrap" 
                  Style = "{StaticResource PhoneTextExtraLargeStyle}" /> 
                < TextBlock Text = "{Binding throwText}" 
                            TextWrapping = "Wrap" 
                            Margin = "12,-6,12,0" 
                Style = "{StaticResource PhoneTextSubtleStyle}" /> 
            </ StackPanel > 
        </ StackPanel > 
    </ DataTemplate > 
 </ ListBox.ItemTemplate > 
</ ListBox > 

我想在该列表框中填写一些内容.. 并在 ma​​inpage.xaml.cs 中创建了一个 ObservableCollection 并认为我可以将 ItemsSource 指向它,但没有任何显示列表。

    public class ListItems
    {
        public string throwText;
        public string throwLocation;
    }

    List<ListItems> listItems = new List<ListItems>();
    public ObservableCollection<ListItems> oblItems = 
                      new ObservableCollection<ListItems>();

    // Load data for the ViewModel Items
    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {

        ListItems li = new ListItems();
        //li.thumb = new BitmapImage();

        li.throwLocation = "Denmark. Åbenrå";
        li.throwText = "Throw text";
        oblItems.Add(li);

        partyList.DataContext = oblItems; // Don't know if this makes any sense? 
        partyList.ItemsSource = oblItems;

        MessageBox.Show(oblItems[0].throwLocation);
    }

我得到消息框,我可以看到数据已到达 oblItems 集合,但列表框中没有任何内容。

我做错了什么?我认为这应该很简单。

【问题讨论】:

    标签: windows-phone-7


    【解决方案1】:

    好的,您的问题的答案分为两部分,一是绑定失败的原因,二是提示。 您的数据不显示的原因是“ListItems”类中的两个属性未正确声明,它们需要使用 Getter 和 Setter 完全声明属性,如下所示:

        public class ListItems
    {
        public string throwText  { get; set; }
        public string throwLocation { get; set; }
    }
    

    简单地说,除非您正确公开这些值,否则 Silverlight 无法正确绑定和请求数据。

    现在提示 如果您使用 Windows Phone SDK 启动 DataBound 模板,您将看到一种更好的方法,即使用 MVVM(适当数据绑定的框架),在其中分离视图(XAML)、模型(您的数据看起来例如,您的属性)和数据。 MVVM 是一种更加数据/类型安全的设计应用程序的方法,通过数据绑定显示数据。 一旦你看完了,我还建议你看看 MVVMLight (http://mvvmlight.codeplex.com) 或 Calburn.Micro (http://caliburnmicro.codeplex.com) 等框架,以便为你做好准备未来。

    希望这会有所帮助。

    【讨论】:

    【解决方案2】:

    你需要在列表上调用databind:partyList.DataBind()。这就是 c 使用要实际添加到列表中的项目。

    【讨论】:

    • 现在速度很快! :-) 但是partyList对象(Listbox)上没有这样的方法?
    • 您使用的列表框是什么类型的?如果您浏览到partyList 上的定义并告诉我。
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2012-10-12
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多