0

次のクエリがあります。

var qry = from itemA in db.TableA 
          join itemB in db.TableB on itemA.ID equals itemB.ID  
          join itemC in db.ItemC on itemA.ID equals itemC.ID  
          select new { itemC, itemA, itemB};

次のようにクエリを Datagrid にバインドするとします。

dgTest.ItemsSource = qry;

Datagrid の TextColumn を次のように構成します。

<DataGrid x:Name="dgTest" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Test" Binding="{Binding TableA.Name}"/>
    </DataGrid.Columns>
</DataGrid>

列が空です...
誰かが私が間違っていることを教えてもらえますか?

前もって感謝します!

4

1 に答える 1

2

データバインディングに暗黙的に型指定された変数を使用することはできません。

objectTableAを想定して、次のようにしますTableBTableC

public class TableA
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class TableB
{
    public int ID { get; set; }
}

public class TableC
{
    public int ID { get; set; }
}

select new {ここで、ステートメントで行っているように暗黙の型を使用するのではなく、具体的なクラスを作成する必要があります。

たとえば、次のようになります。

public class MyConcreteClass
{
    public TableA TableA { get; set; }
    public TableB TableB { get; set; }
    public TableC TableC { get; set; }
}

最後に、LINQ クエリがあるクラスは次のようになります。

public class MyDataSource : INotifyPropertyChanged
{
    private Database db;

    public MyDataSource()
    {
        db = new Database()
        {
            TableA = new List<TableA> 
            {
                new TableA { ID = 1, Name = "Hello world!" }
            },
            TableB = new List<TableB>
            {
                new TableB { ID = 1 }
            },
            TableC = new List<TableC>
            {
                new TableC { ID = 1 },
                new TableC { ID = 2 }
            }
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public IEnumerable<MyConcreteClass> MyConcreteClass
    {
        get { return this.MyQuery(); }
    }

    private IEnumerable<MyConcreteClass> MyQuery()
    {
        var qry = from itemA in db.TableA
                  join itemB in db.TableB on itemA.ID equals itemB.ID
                  join itemC in db.TableC on itemA.ID equals itemC.ID
                  select new MyConcreteClass
                  {
                      TableA = itemA,
                      TableB = itemB,
                      TableC = itemC
                  };

        return qry.AsEnumerable();
    }
}

Databaseクラスがそのようなものを探していると:

public class Database
{
    public IEnumerable<TableA> TableA { get; set; }
    public IEnumerable<TableB> TableB { get; set;  }
    public IEnumerable<TableC> TableC { get; set;  }
}

ItemsSourceあなたのプロパティをに設定しDataGridます{Binding MyConcreteClass}

最も重要なポイントは次のとおりです。

  • プロパティにのみバインドできます。フィールドまたはメソッドにデータバインドすることはできません。
  • 暗黙の型にバインドすることはできません。

必要に応じてビューモデルを実装し、必要に応じてsINotifyPropertyChangedを使用することも忘れないでください。ObservableCollection

于 2012-05-26T13:00:34.907 に答える