【问题标题】:Tricky WPF binding棘手的 WPF 绑定
【发布时间】:2011-06-08 13:02:10
【问题描述】:

我无法在 Silverlight 4(WP7 开发)中进行简单但棘手的 WPF 绑定

我有以下代码:

Class People{
    public string firstname;
    public string lastname;
}

Class DataSource{
    public static List<People> people; // consider this as a list filled with objects already
}

我正在尝试将人员列表放入 ListBox,这是我尝试过的 xaml:

            <ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding DataSource.people}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                      <StackPanel Margin="0,0,0,17" Width="432">
                            <TextBlock Text="{Binding firstname}" TextWrapping="Wrap"/>
                            <TextBlock Text="{Binding lastname}" TextWrapping="Wrap"/>
                      </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

但不幸的是,我的列表框仍然是空的。我做错了什么?

提前谢谢你:)

干杯, 米卢德 B.

【问题讨论】:

    标签: wpf data-binding windows-phone-7 listbox binding


    【解决方案1】:

    首先您使用的是字段,您应该在其中使用public 属性(即人员、名字和姓氏)。将people 转换为公共属性,如下所示:

    public static List<People> people { get; set; }
    

    然后,您需要使用x:Static 标记绑定ItemsSource,如下所示:

    <ListBox x:Name="peoplelistbox" Margin="0,0,-12,0">
       <ListBox.ItemsSource>
          <Binding Source="{x:Static local:DataSource.people}"/>
       <ListBox.ItemsSource/>
       ...
    

    PS:local 是指向 DataSource 类命名空间的 xml 命名空间。此外,您的课程也需要是公共课程。

    编辑:
    对于 WP7,你需要在资源中声明类的实例,然后你可以使用Path 指向源。像这样:

    <phone:PhoneApplicationPage.Resources>
        <local:DataSource x:Key="dataSource"/>
    </phone:PhoneApplicationPage.Resources>
    ...
    <ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding Source={StaticResource dataSource}, Path=people}">
    

    PS:同样,你的类需要是公共的,并且必须有一个默认的构造函数。

    编辑:
    这是一个在我的系统上完美运行的示例。检查并查看您在哪里犯了错误:

    namespace WindowsPhoneApplication1
    {
        public class People
        {
            public string firstname { get; set; }
            public string lastname { get; set; }
        }
    
        public class DataSource
        {
            public static List<People> people { get; set; }
    
            public DataSource() { }
    
            static DataSource()
            {
                people = new List<People> {new People {firstname = "Foo", lastname = "Bar"}};
            }
        }
    
        public partial class MainPage : PhoneApplicationPage
        {
            // Constructor
            public MainPage()
            {
                InitializeComponent();
            }
        }
    }
    

    Xaml(仅相关部分):

    ...
    ...
    xmlns:local="clr-namespace:WindowsPhoneApplication1"
    ...
    ...
    <phone:PhoneApplicationPage.Resources>
        <local:DataSource x:Key="dataSource"/>
    </phone:PhoneApplicationPage.Resources>
    ...
    ...
    <ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding Source={StaticResource dataSource}, Path=people}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0,0,0,17" Width="432">
                    <TextBlock Text="{Binding firstname}" TextWrapping="Wrap"/>
                    <TextBlock Text="{Binding lastname}" TextWrapping="Wrap"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    【讨论】:

    • 没关系,但记得添加xmlns:my="clr-namespace:datasourcenamespace",然后修复与&lt;Binding Source="{x:Static my:DataSource.People}" /&gt;的绑定。还修复 ItemsSource 将其更改为 ListBox.ItemsSource
    • 感谢 as-cii。都是凭记忆打出来的。已更正。
    • 感谢您的提示。但它不适用于 SV4。我忘了提到我正在开发 WP7。
    • @Yogesh 非常感谢。事实上,我没有 Window 命名空间,我也尝试过使用
    • 糟糕。再次更正。 :P
    【解决方案2】:

    1.FirstNameLastName 必须是至少具有 getter 的公共属性。
    2.您的列表也应该是公共属性,除非您明确设置窗口的DataContext
    3.需要设置DataContext或引用源否则。
    4.你不能像那样绑定静态属性,使用{x:Static ...}
    5.这不是一个棘手的绑定-.-

    正如 devdigital 所说,您可能也希望实现这些接口。

    【讨论】:

    • 这不是一个棘手的绑定,但你提到的所有东西都不能解决问题;)。谢谢你的提示干杯
    • 好吧,几乎所有在绑定中可能做错的事情都是你的错误,所以很容易错过一些东西。我认为你应该在问这个问题之前阅读绑定的基础知识......
    • 不要将此视为人身攻击,我只是在惹你......你说得对,我应该在问之前阅读基础知识,但我绝对没有时间,我有一个项目在工作,这个绑定只是其中的一小部分,这就是为什么我想利用我的时间来完成整个事情并尝试在 stackoverflow 上找到绑定的解决方案。我计划阅读这个,因为它非常重要。干杯
    【解决方案3】:

    您只能绑定到属性,因此请将您的公共字段更改为属性。

    另外,如果您希望您的 UI 更新人员实例的编程更改,请在您的 People 类型上实现 INotifyPropertyChanged(实际上该类型应该称为 Person)。

    如果您希望在从 DataSource 人员集合中添加/删除项目时更新 UI,请使用 ObservableCollection&lt;T&gt; 而不是 List&lt;T&gt;

    【讨论】:

    • 嗨 devdigital。感谢您的提示! - 属性字段:完成 - INotifyPropertyChanged:已实现 - 无法在 WP7 和 WCF 中使用 ObservableCollection :(
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多