WPF绑定存储库和模型

时间:2011-11-22 13:53:22

标签: c# wpf data-binding

我有两个班级,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>

这不起作用。推理中有基本错误吗?我该如何解决这个问题?

1 个答案:

答案 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}。不要忘记构建列表并填充它,当然......