我正在努力转向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;
答案 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" />