WPF数据绑定:如何将存储过程绑定到Listview

时间:2009-05-06 18:15:20

标签: c# wpf data-binding stored-procedures

我有一个按钮,单击该按钮将在SQL Server上运行存储过程,并在同一窗口的网格中显示结果数据。

在Windows窗体世界中,我创建一个数据表,使用dataadapter填充它,然后将数据表分配给我的DataGridView的数据源属性和poof ...这是我的数据。

我在使用带有Gridview的ListView尝试了类似的WPF,我似乎无法使其工作。我的XAML中有以下内容:

<ListView Grid.Row="1" Name="Preview" ItemsSource="{Binding Path=Report}">
  <GridView>
    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FormalName}" />
  </GridView>
</ListView>

<ListView Grid.Row="1" Name="Preview" ItemsSource="{Binding Path=Report}"> <GridView> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FormalName}" /> </GridView> </ListView>

在我的C#代码中

当我点击按钮(触发CreateReport方法)时,我的数据表被填充并分配给Datacontext,但没有显示任何内容。

3 个答案:

答案 0 :(得分:6)

我制作了一个示例应用程序并发现您需要使用ListView.View包围GridView并将ItemsSource设置为{Binding},如下所示:

<ListView Name="Preview" ItemsSource="{Binding}">
<ListView.View>
  <GridView>
    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=FormalName}" />
  </GridView>
 </ListView.View>
</ListView>

答案 1 :(得分:1)

我认为部分问题是你还在考虑WinForms。而不是将Grid绑定到Table,如何将ListBox绑定到Collection?

请改为尝试:

1)创建另一个实现INotifyPropertyChanged的类。我们将把这个类用于DataContext。把它想象成你的BindingEngine。我通常将它作为Window本身的DataContext,使其可以在Window中的任何位置使用。

2)在一个ObservableCollection的新类中公开一个属性,其中YourType是另一个实现INotifyPropertyChanged的类,并公开你想要显示的数据属性。

3)在Engine中创建一个填充Collection的方法。然后在填充PropertyChanged事件时触发它。

4)将ListBox ItemsSource绑定到Property。

5)创建一个ItemTemplate并使用YourType中的属性名称进行绑定。

这是伪代码,但应该让你关闭:

<Window>
    <Window.Resources>
        <ObjectDataProvider x:Key="MyEngineDS" ObjectType="{x:Type MyEngine:MyEngineNamespace}" d:IsDataSource="True"/>
        <DataTemplate x:Key="ItemTemplate1">
            <TextBlock Text="{Binding MyPropertyName}" />
        </DataTemplate>
    </Window.Resources>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource MyEngineDS}"/>
    </Window.DataContext>
    <Grid x:Name="LayoutRoot">
        <ListBox ItemsSource="MyCollection" ItemTemplate="{DynamicResource ItemTemplate1}" />
    </Grid>
</Window>

希望这有帮助。

答案 2 :(得分:0)

请尝试使用ItemsSource =“{Binding}”。