我有两个班级,Handy
(这是一个带有ID,姓名和年份的模型)和一个HandyRepository
。
我的HandyRepository看起来像这样:
private IList<Handy> list = new List<Handy>(new Handy[] {
new Handy{ ID=1, Name="Nokia ", Jahr=1999},
new Handy{ ID=2, Name="HTC m", Jahr=2333},
new Handy{ ID=3, Name="Samsung", Jahr=2134} });
public IEnumerable<Handy> GetList()
{
return this.list;
}
现在,我希望将数据发送到我的wpf应用程序中的ListBox,而无需在代码隐藏文件中编写任何代码。
我的尝试:
xmlns:local="clr-namespace:Handy"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.DataContext>
<local:Handy></local:Handy>
</Grid.DataContext>
<ListBox Name="lbBinding" ItemsSource="{Binding Name}"></ListBox>
</Grid>
这不起作用。推理中有基本错误吗?我该如何解决这个问题?
答案 0 :(得分:1)
您尚未设法将ItemsSource绑定到实际集合。首先,您需要创建一个集合并为其提供一个可以识别它的密钥:
<x:Array x:Key="HandyList" Type="{x:Type local:Handy}">
<local:Handy Name="Nokia " Jahr="1999" ID="1" />
<local:Handy Name="HTC m", Jahr="2333" ID="2" />
</x:Array>
密钥可以是您喜欢的任何标识符。
然后你需要告诉ListBox寻找那个键:
<ListBox ItemsSource="{StaticResource HandyList}" Name="lbBinding" />
不幸的是,这将无法完全正确呈现,因为您将获得ListBox中出现的Handy类的默认ToString(),因此您需要告诉它如何呈现:
<ListBox ItemsSource="{StaticResource HandyList}"
Name="lbBinding"
DisplayMemberPath="Name" />
这将确保它使用Name属性作为要在ListBox中呈现的字符串的源。如果需要,可以通过提供自定义DataTemplate来执行更复杂的渲染。
当然,您在XAML中定义ItemsSource的实际应用程序很少。绑定到视图的DataContext的属性更为正常。最简单的方法是在代码隐藏中向视图本身添加一个属性:
public List<Handy> HandyList { get; set; }
然后在调用InitializeComponent()之后将视图设置为其构造函数中的DataContext:
DataContext = this;
然后,您可以将XAML中的ItemsSource绑定到{Binding Path = HandyList}。不要忘记构建列表并填充它,当然......