Хитрый WPF переплет - PullRequest
       10

Хитрый WPF переплет

2 голосов
/ 13 января 2011

Я не могу сделать простую, но сложную привязку WPF в Silverlight 4 (разработка WP7)

У меня есть следующий код:

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>

Но, к сожалению, мой список остается пустым.Что я делаю не так?

Заранее спасибо:)

Ура, Милуд Б.

Ответы [ 3 ]

5 голосов
/ 13 января 2011

Во-первых, вы используете поля, где вы должны использовать свойство public (то есть люди, имя и фамилия).Преобразуйте people в публичное свойство, например:

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

Затем вам нужно связать ItemsSource с помощью x:Static разметки, например:

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

PS: local - это пространство имен xml, указывающее на пространство имен вашего DataSource класса.Кроме того, ваш класс тоже должен быть общедоступным.

РЕДАКТИРОВАТЬ: Для 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>
1 голос
/ 13 января 2011

1. FirstName и LastName должны быть публичными свойствами, по крайней мере, с геттерами.2. Ваш список также должен быть общедоступным, если вы явно не установили DataContext вашего окна.3. Нужно либо установить DataContext, либо ссылаться на источник в противном случае.4.Вы не можете связываться со статическими свойствами, такими как *, используйте {x:Static ...}.5. Это не сложная привязка -.-

Как сказал devdigital, вы также можете реализовать эти интерфейсы.

0 голосов
/ 13 января 2011

Вы можете привязывать только свойства, поэтому измените ваши открытые поля на свойства.

Кроме того, если вы хотите, чтобы ваш пользовательский интерфейс обновлял программные изменения в экземплярах ваших сотрудников, то внедрите INotifyPropertyChanged для вашего типа People (в действительности этот тип должен называться Person).

Если вы хотите, чтобы ваш пользовательский интерфейс обновлялся при добавлении / удалении элементов из вашей коллекции сотрудников DataSource, тогда используйте ObservableCollection<T> вместо List<T>.

...