none
textBlock绑定DataTable的某一个字段 RRS feed

  • 问题

  • 想把textBlock绑定到一个DataTable的一个字段,将DataTable赋给textBlock的父控件Grid的DataContent,然后在text={Binding XXX},没有效果,请问要怎么绑定,可以实现吗?
    2012年4月27日 8:30

答案

  • WPF中的绑定需要数据源提供的是一个属性。 为什么DataGrid可以呢?是因为DataTable到DataTable上的其实是DataView,然后又被封装成了ICollectionView, 这样之后,就能够提供出一个属性给其里面的单元格绑定使用了。

    我测试了你的问题,不过是否进行封装,DataTable都会被隐式转成DataView:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
      <StackPanel>
        <StackPanel.Resources>
          <CollectionViewSource x:Key="source" Source="{Binding}"/>
        </StackPanel.Resources>
        <TextBlock Text="{Binding Source={StaticResource source}, Path=Name}"/>
        <TextBlock Text="{Binding Source={StaticResource source}, Path=Age}"/>
        <TextBlock Text="{Binding Path=Name}"/>
        <TextBlock Text="{Binding Path=Age}"/>
      </StackPanel>
    </Window>

    C#:
        public MainWindow()
        {
          InitializeComponent();
    
          DataTable dt = new DataTable();
          dt.Columns.Add(new DataColumn("Name"));
          dt.Columns.Add(new DataColumn("Age"));
          DataRow dr = null;
          for (int i = 0; i < 10; i++)
          {
            dr = dt.NewRow();
            dr["Name"] = "Name " + i;
            dr["Age"] = 20+ i;
            dt.Rows.Add(dr);
          }
          this.DataContext = dt;
        }

    但是,你将一个集合的所有成员的又一个属性绑定给一个元素,不是很有意义。不过你需要绑定集合中某一个元素的属性的话,用[index]在Path定位。

    例如:

        <TextBlock Text="{Binding Source={StaticResource source}, Path=Rows[2][0]}"/>
        <TextBlock Text="{Binding Source={StaticResource source}, Path=Rows[2][1]}"/>
        <TextBlock Text="{Binding Path=Rows[2][0]}"/>
        <TextBlock Text="{Binding Path=Rows[2][1]}"/>


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月30日 3:48
    版主