DataBinding和样式的问题[WP7]

时间:2011-01-20 23:51:59

标签: c# .net data-binding windows-phone-7

我一直试图在WP7上用Xaml中的observableConnection绑定列表框而没有运气。我想做的就是让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 个答案:

答案 0 :(得分:1)

您将要使用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接口。

答案 1 :(得分:0)

正如Jared建议的那样,对您的解决方案最合适的方法是为ItemTemplate提供ListBoxListBox定义ToString中每个项目的结构,这使您能够绑定直接指向类的属性,而不必覆盖DataTemplate方法。但是,Jared的<ListBox> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding name}" /> <TextBlock Text="{Binding description}" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 中存在一个小错误,因为它只能包含一个项目,因此您需要将元素包装在某种容器中,如下所示:

INotifyPropertyChanged

如果属性可以在该对象的生命周期内更改,则只需在Category类上实现{{1}}。如果值在整个生命周期内保持不变,那么就没有必要了。

答案 2 :(得分:0)

通常,ObservableCollection是View绑定到的ViewModel的成员。您不必从ObservableCollection继承,Categories类中的逻辑可以放在ViewModel中。

然后,您需要将层次结构中的Page或其他对象的DataContext设置为ViewModel,然后您可以将ListBox.ItemsSource绑定到ViewModel.ObservableCollection。

之后,DataTemplate将在Category的范围内工作(ObservableCollection中的单项)。

关于加载等的逻辑,通常还有一个层负责这些操作,这些操作被注入ViewModel,但是如果你不想要它,那就没关系。