0

型指定された DataTable の DataView プロパティに対する DataGrid の試合がありますが、[列の生成] をクリックすると、「このアクションを実行する前に 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 プロパティを公開します。ここでどこが間違っていたのかについて何か提案はありますか?

4

1 に答える 1

1

バインディングがおそらく間違っているようです。バインディング先はコレクションではないため、バインディングから先頭のスラッシュを削除してください。現在のアイテムはありません。

例を試してみると、出力に次のように表示されます。

System.Windows.Data エラー: 40: BindingExpression パス エラー: '' コレクションの現在のアイテム''TransferSchedulesView' (HashCode=19117974)' にプロパティが見つかりません。BindingExpression:Path=TransferSchedulesView/; DataItem='MainWindow' (Name=''); ターゲット要素は 'DataGrid' (Name='dataGrid1') です。ターゲット プロパティは '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; } 
    }
}
于 2012-06-26T19:53:45.227 に答える