为什么生成列不适用于绑定到DataTable的DataView的DataGrid?

时间:2012-06-26 19:46:28

标签: wpf xaml datagrid

我有一个DataGrid回合到类型化DataTable的DataView属性但是当我单击Generate Columns时,我得到“你必须先设置ItemsSource才能执行这个动作”。不知道我在这里做错了什么。请参阅下面的XAML:

    <DataGrid AutoGenerateColumns="True" HorizontalAlignment="Stretch" 
      Margin="0" Name="dataGrid1" VerticalAlignment="Stretch" 
      ItemsSource="{Binding Path=DataView/}" 
      DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1},
      Path=TransferSchedulesView/}">

TransferSchedulesView是我的MainWindow上的一个属性,它公开了一个类型化的DataTable成员的DataView属性。关于我在哪里出错的任何建议?

1 个答案:

答案 0 :(得分:1)

我看到你的绑定可能不正确。从绑定中删除前导斜杠,因为绑定的内容不是集合,因此它没有当前项。

以下是我在尝试您的示例时在输出中看到的内容:

  

System.Windows.Data错误:40:BindingExpression路径错误:''   “当前收藏品”上找不到的物业   ''TransferSchedulesView'(HashCode = 19117974)'。   BindingExpression:路径= TransferSchedulesView /;的DataItem = '主窗口'   (名称= ''); target元素是'DataGrid'(Name ='dataGrid1');目标   property是'DataContext'(类型'Object')

这是我的工作示例。如果你运行它,你会看到自动生成的列:

<DataGrid AutoGenerateColumns="True"
    ItemsSource="{Binding Path=DataView}" 
    DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=WpfApplication1:MainWindow, AncestorLevel=1}, Path=TransferSchedulesView}" />

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public TransferSchedulesView TransferSchedulesView { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            TransferSchedulesView = new TransferSchedulesView(){DataView = CreateTable()};
        }

        private static DataTable CreateTable()
        {
            var dataTable = new DataTable();
            dataTable.Columns.Add("aaa");
            dataTable.Columns.Add("bbb");
            dataTable.Columns.Add("ccc");
            dataTable.Rows.Add("sdaasdasd", "dsdsadasdasdsd", "sdasdadsadsadsd");
            dataTable.Rows.Add("sdaasdasd", "dsdsadasdasdsd", "sdasdadsadsadsd");
            dataTable.Rows.Add("sdaasdasd", "dsdsadasdasdsd", "sdasdadsadsadsd");
            return dataTable;
        }
    }

    public class TransferSchedulesView
    {
        public DataTable DataView { get; set; } 
    }
}