1

我有一个类似于

class Quote
{
    string Ticker {set; get; }
    string Rating {set; get;}
    People Sender {set; get;}
}

Peaple被定义为,

class People
{
    string Email {set; get;}
    int Age {set; get;}
    string Firm {set; get;}
}

我也有一个 ObservableCollection 的报价单,

ObservableCollection <Quote> QuoteList;

现在我想在 DataGrid 中显示 QuoteList,这样每一行都有以下 3 个单元格,1. Quote.Ticker 2. Quote.Rating 3. Quote.Sender.Email

我还想,如果我单击每一行,我可以获得该单击行的 Quote 对象。请问我怎样才能做到这一点?

4

1 回答 1

3

如果您将您的对象绑定DataGrid到其中ItemsSource的一个,则ObservableCollection<Quote>每个对象都DataGridRowQuote按照它的原样DataContext(数据层)构建。

默认情况下,DataGrid 将自动为数据项上的每个属性生成一个列,因此在您的情况下,它将为 、 和 生成Ticker一个RatingSender

您可以通过设置AutoGenerateColumns="False"和定义自己的来覆盖它<DataGrid.Columns>,其中包括绑定到的列Sender.Email

<DataGrid ItemsSource="{Binding Quotes}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Ticker"  Binding="{Binding Ticker}"/>
        <DataGridTextColumn Header="Rating"  Binding="{Binding Rating}"/>
        <DataGridTextColumn Header="Email"  Binding="{Binding Sender.Email}"/>
    </DataGrid.Columns>
</DataGrid>

或者您可以使用隐式 DataTemplate 告诉 WPFSender使用包含Email属性的字符串绘制对象

<DataGrid ItemsSource="{Binding Quotes}">
    <DataGrid.Resources>
        <DataTemplate TargetType="{x:Type local:People}">
            <TextBlock Text="{Binding Email}" />
        </DataTemplate>
    </DataGrid.Resources>
</DataGrid>

在这两个中,我会根据您的情况选择第一个,因为您不需要为编辑之类的事情编写任何额外的代码

至于单击行时获取数据对象,只需检查DataContext行的,或绑定CommandParameter"{Binding }"

于 2012-09-27T14:08:04.377 回答