我一直试图在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);
}
}
}
答案 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
提供ListBox
,ListBox
定义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,但是如果你不想要它,那就没关系。