Проблема с привязкой данных и стилем [WP7] - PullRequest
0 голосов
/ 21 января 2011

Я безуспешно пытался связать listbox с наблюдаемым соединением в Xaml на WP7. Все, что я хочу сделать, это сделать listbox, чтобы показать экземпляр моего класса, который наследуется от ObservableConnection, и применить некоторый стиль к listbox. Я могу сделать это из кода вроде

public Storage.Categories tmp;
...
tmp = new Storage.Categories();
listBox1.ItemsSource = tmp;

а как применить стиль к этому? Вот код:

<ListBox Height="497"
         HorizontalAlignment="Left"
         Margin="0,104,0,0"
         Name="listBox1"
         VerticalAlignment="Top"
         Width="450">


namespace Genesa.Storage
{
    public class Categories : ObservableCollection<Category>
    {
        public void LoadCategories()
        {
            // deserialize obiect
        }

        public void SaveCategories()
        {
            // serialize obiect
        }

        public Categories() : base()
        {
            LoadCategories();
        }
    }

    public class Category
    {
        public Category() { }
        public String name { get; set; }
        public String description { get; set; }

        public Category(String _name, String _description)
        {
            name = _name;
            description = _description;
        }

        public override string ToString()
        {
            return String.Format("{0} - {1}", name, description);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 21 января 2011

Вы собираетесь использовать DataTemplate.Шаблон данных позволяет вам структурировать элементы в вашем ListBox.Например:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding name}" />
            <TextBlock Text="{Binding description}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Также вы можете пересмотреть наследование от ObservableCollection.Если то, что вы делаете, так просто, как кажется выше, вы, вероятно, захотите создать класс, который содержит ObservableCollection и реализует интерфейс INotifiyPropertyChanged.Предполагается, что вы используете шаблон проектирования MVVM.Если нет, не стесняйтесь игнорировать это предложение.Если вы реализуете MVVM, вы также хотите, чтобы класс Category реализовал интерфейс INotifyPropertyChanged.

0 голосов
/ 14 марта 2011

обычно ObservableCollection является членом ViewModel, к которому привязывается View.Вам не нужно наследовать от ObservableCollection, и логика из класса Categories может быть размещена внутри ViewModel.

Затем необходимо установить DataContext of Page или другой объект в иерархии как ViewModel, а затем вы можете привязать, например, ListBox.ItemsSource к ViewModel.ObservableCollection.

После этого DataTemplate будет работатьобласть действия Category (отдельный элемент в ObservableCollection).

Что касается логики загрузки и т. д., обычно есть еще один слой, отвечающий за эти операции, который внедряется в ViewModel, но если он вам не нужен, этопросто отлично.

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

Как предполагает Джаред, наиболее подходящим подходом к вашему решению является предоставление ItemTemplate для ListBox, который определяет структуру каждого элемента в ListBox, что позволяет вам напрямую связываться со свойствами вашего классавместо необходимости переопределять метод ToString.Однако есть небольшая ошибка в DataTemplate Джареда, потому что он может содержать только один элемент, поэтому вам нужно обернуть элементы в какой-нибудь контейнер, как показано ниже:реализовать INotifyPropertyChanged в вашем классе Category, если свойства могут измениться в течение времени жизни этого объекта.Если значения постоянны в течение всего срока службы, то в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...