将wpf listview绑定到数据集......可能..?

时间:2009-06-07 13:21:32

标签: wpf data-binding ado.net binding dataset

我正在努力转向Wpf,我只是在尝试数据绑定到lsitview时卡住了。我想将listview数据绑定到数据集(数据集,因为我希望在列中显示的数据属于不同的表)。我是附上我正在尝试的示例代码。它工作正常,但listliew只显示一行。可能是错的。任何人都可以指导我。所有可用的示例都使用datatables.None指定绑定到数据集.Pls帮助..非常感谢...非常感谢...提前感谢

我的Xaml

<Grid>
<TextBox Text="" Height="20" Width="100" HorizontalAlignment="Left" Margin="15,13,0,0" VerticalAlignment="Top"></TextBox>
<TextBox Text="" Height="20" Width="100" HorizontalAlignment="Left" Margin="15,42,0,0" VerticalAlignment="Top"></TextBox>
<ListView Margin="15,89,63,73" Name="lst" ItemsSource="{Binding}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name"  DisplayMemberBinding="{Binding Path=T1/Name}"></GridViewColumn>
            <GridViewColumn Header="Place" DisplayMemberBinding="{Binding Path=T2/Name}"></GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
<!--<Button Height="19" HorizontalAlignment="Right" Name="button2" VerticalAlignment="Top" Width="46" Margin="0,42,63,0" Click="button2_Click">Add</Button>-->
<Button Height="19" HorizontalAlignment="Right" Name="button1" VerticalAlignment="Top" Width="46" Click="button1_Click" Margin="0,43,63,0">Add</Button>

我的代码

 Dt1 = new DataTable("T1");
        Dt1.Columns.Add("Name");
        Dt1.Rows.Add("abc1");
        Dt1.Rows.Add("abc2");
        Dt2 = new DataTable("T2");
        Dt2.Columns.Add("Name");
        Dt2.Rows.Add("xyz1");
        Dt2.Rows.Add("xyz1");
        Ds = new DataSet();
        Ds.Tables.Add(Dt1);
        Ds.Tables.Add(Dt2);

        lst.DataContext = Ds;

4 个答案:

答案 0 :(得分:4)

你好,我和安迪和托马斯完全一致。他们都优雅地解释了这个概念。

我只展示了仅对数据集执行相同操作的步骤。

MVVM(ModelView ViewModel)我不在这里讨论。

Xaml看起来像这样

<Grid Name="myGrid" ShowGridLines="False">


    <Label Height="28" Margin="12,5,0,0" Name="lblName" VerticalAlignment="Top" HorizontalAlignment="Left" Width="55">Name</Label>
    <TextBox Height="23" Margin="73,8,85,0" Name="txtName" VerticalAlignment="Top" />
    <Label Height="28" Margin="12,39,0,0" Name="lblPlace" VerticalAlignment="Top" HorizontalAlignment="Left" Width="55">Place</Label>
    <TextBox Height="23" Margin="73,44,85,0" Name="txtPlace" VerticalAlignment="Top" />
    <Button Height="23" HorizontalAlignment="Left" Margin="20,82,0,0" Name="btnAddRecord" VerticalAlignment="Top" Width="75" Click="btnAddRecord_Click">Add Record</Button>
    <ListView Margin="31,119,27,45" Name="listView" *ItemsSource="{Binding}"*>

        <ListView.View>

            <GridView>

                <GridViewColumn Header="Name"  DisplayMemberBinding="{Binding Name}"/>

                <GridViewColumn Header="Place" DisplayMemberBinding="{Binding Place}"/>


            </GridView>
        </ListView.View>
    </ListView>
</Grid>

在.CS文件中创建数据集

private DataSet MyDataSet()
    {
        DataTable dtInformation1 = new DataTable();
        dtInformation1.Columns.Add("Name");
        dtInformation1.Columns.Add("Place");
        dtInformation1.Rows.Add(txtName.Text, txtPlace.Text);


        DataTable dtInformation2 = new DataTable();
        dtInformation2.Columns.Add("Name");
        dtInformation2.Columns.Add("Place");
        dtInformation2.Rows.Add(txtName.Text + "2", txtPlace.Text + "2");

        DataSet Ds = new DataSet();
        Ds.Tables.Add(dtInformation1);
        Ds.Tables.Add(dtInformation2);
        return Ds;
    }

接下来在Button的点击事件中写下以下内容

private void btnAddRecord_Click(object sender,RoutedEventArgs e)

    {

        **listView.ItemsSource = MyDataSet().Tables[0].DefaultView;
              - OR - 
         listView.ItemsSource = MyDataSet().Tables[1].DefaultView;**
    }

N.B.~您无法为ListView的源分配数据集。

为什么?你可能会问? 简单来说,数据集就是数据表的集合。

假设您有5个不同的数据表。并且说他们的列名和列号都不相同。

现在您已将所有这些分配给数据集。控件源如何知道它必须绑定哪个源?

为了克服这种情况,要么创建一个自定义数据表,该数据表将包含这些自定义数据表的所有列,并将值分配给此自定义数据表,然后绑定到源。

或者您需要在数据源中明确指定数据表

但我总是喜欢使用MVVM模式进行这种操作。

答案 1 :(得分:2)

我不确定你在这里想做什么......这是你期望的结果吗?

abc1    xyz1
abc2    xyz2

您的表之间没有任何关系,因此绑定系统无法猜测您要将哪一行T1与T2的哪一行关联...您应该将所有数据放在同一个表中,或者使用DataRelation在两个表之间(但这需要额外的字段用于连接)。然后,您可以将DataTable设置为ItemsSource,而不是DataSet。

或者,您可以创建一个专用类来保存数据,如Andy

所示

答案 2 :(得分:1)

WPF Binding使用属性。例如,请考虑以下Person对象:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

然后,您可以通过执行以下操作修改ListView的XAML以显示Person个对象的集合:

<ListView Margin="15,89,63,73" Name="lst" ItemsSource="{Binding}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First Name"
                DisplayMemberBinding="{Binding Path=FirstName}" />
            <GridViewColumn Header="Last Name"
                DisplayMemberBinding="{Binding Path=LastName}" />
        </GridView>
    </ListView.View>
</ListView>

这将在第一列显示对象的名字,在第二列显示它们的姓氏(假设DataContext的{​​{1}}是ListView个对象的集合)

理论上,要将Person中的值绑定到DataTable,您可以将ListView设置为ItemsSource的{​​{1}}属性。问题变成DataTable类不公开其列的属性 - 只有Rows属性接受指定行的参数。据我所知,XAML不支持带参数的属性,因此我认为DataRow不能使用Item DataTable

但是,您还有其他一些选择。您可以创建一个强类型ItemsSource,它会为ListView公开每个列的属性。然后,您可以将每个DataSet绑定到正确的属性。

另一种方法是根本不使用DataTable。您的数据层仍会将数据从源加载到GridViewColumn,但它会将该数据转换为普通对象。您可以创建ObservableCollection的实例,将每个对象添加到其中,然后将DataTable绑定到该实例。每个DataTable只会绑定到对象的相应属性。

<强>更新

回答OP的进一步问题:

  

我可以使用xsd吗?.It   拥有每个数据表的属性..

您需要的不仅仅是DataTable的属性。您还需要DataTable每行中每个值的属性。否则,ListView的列没有属性可以绑定到。

答案 3 :(得分:1)

这对我有用。

public partial class MainWindow : Window
{

   public  ObservableCollection<DataTable> _observableCollection =
   new ObservableCollection<DataTable>();

    public MainWindow()
    {
        InitializeComponent();

        DataTable dt1 = new DataTable();
        dt1.Columns.Add("OrderID");
        dt1.Columns.Add("CustomerID");
        dt1.Columns.Add("ProductID");
        dt1.Rows.Add("test1", "test2", "test3");

        DataTable dt2 = new DataTable();
        dt2.Columns.Add("OrderID");
        dt2.Columns.Add("CustomerID");
        dt2.Columns.Add("ProductID");
        dt2.Rows.Add("test4", "test5", "test6");

        _observableCollection.Add(dtInformation1);
        _observableCollection.Add(dtInformation2);
    }

    public ObservableCollection<DataTable> _Collection
       { get { return _observableCollection; } }

ListView XAML

<ListView  Height="Auto" 
HorizontalAlignment="Stretch" 
Name="somename" 
ItemsSource="{Binding _Collection}" VerticalAlignment="Stretch" Width="Auto" >

  <GridViewColumn  Header="OrderID" Width="auto" >
      <GridViewColumn.CellTemplate>
          <DataTemplate>
              <Button Tag="{Binding OrderID}" Content="{Binding OrderID}"/>
          </DataTemplate>
      </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn Width="auto" DisplayMemberBinding="{Binding CustomerID}" Header="CustomerID" />
  <GridViewColumn Width="auto" DisplayMemberBinding="{Binding ProductID}" Header="ProductID" />