ListBox ItemTemplate 中的 DataGrid 不继承绑定?

DataGrid within ListBox ItemTemplate not inheriting bindings?

我有一些嵌套控件似乎没有正确继承绑定...或者它可能完全是其他东西。我对 WPF 有点陌生。

我有一个 objects 的 ObservableCollection 绑定到 ListBox 并且在顶层这似乎有效,因为按预期为 collection 中的每个项目添加了一行。问题是我需要在 ListBox 的 ItemTemplate 中放置一个 DataGrid 并且...

我得到的只是我手动指定的 headers。没有来自绑定的数据 objects.

我可能刚刚做了一些蠢事。这是稍微简化的代码:

XAML:

<ListBox x:Name="ReportListBox" Margin="10,10,10,10" Grid.Row="1" ItemsSource="{Binding Path=SummaryTotals, Mode=OneWay}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <DataGrid>
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Date, StringFormat=\{0:MM/dd/yyyy\}}" Header="Date"/>
                            <DataGridTextColumn Binding="{Binding GrossRevenue}" Header="Gross Revenue" />
                            <DataGridTextColumn Binding="{Binding OurRevenue}" Header="Our Revenue" />
                            <DataGridTextColumn Binding="{Binding Cost}" Header="Cost" />
                            <DataGridTextColumn Binding="{Binding Profit}" Header="Profit" />
                            <DataGridTextColumn Binding="{Binding Roi}" Header="ROI" />
                            <DataGridTextColumn Binding="{Binding Rpc}" Header="RPC" />
                            <DataGridTextColumn Binding="{Binding Clicks}" Header="Clicks" />
                            <DataGridTextColumn Binding="{Binding Conversions}" Header="Conversions" />
                            <DataGridTextColumn Binding="{Binding ConversionRate}" Header="Conversion Rate" />
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

C#:

public class SummaryTotalRecord
        {
            public DateTime Date { get; set; }
            public decimal Cost { get { return Google.Cost + Ypa.PureLocal.Cost + Ypa.BuyerPricer.Cost; } }
            public decimal GrossRevenue { get { return Google.GrossRevenue + Ypa.PureLocal.GrossRevenue + Ypa.BuyerPricer.GrossRevenue; } }
            public decimal OurRevenue { get { return Google.OurRevenue + Ypa.PureLocal.OurRevenue + Ypa.BuyerPricer.OurRevenue; } }
            public decimal Roi { get { return (Google.Roi + Ypa.PureLocal.Roi + Ypa.BuyerPricer.Roi)/3; } }
            public decimal ConversionRate { get { return (Google.ConversionRate + Ypa.PureLocal.ConversionRate + Ypa.BuyerPricer.ConversionRate)/3; } }
            public decimal Profit { get { return Google.Profit + Ypa.PureLocal.Profit + Ypa.BuyerPricer.Profit; } }
            public decimal Rpc { get { return (Google.Rpc + Ypa.PureLocal.Rpc + Ypa.BuyerPricer.Rpc)/3; } }
            public long Clicks { get { return Google.Clicks + Ypa.PureLocal.Clicks + Ypa.BuyerPricer.Clicks; } }
            public long Conversions { get { return Google.Conversions + Ypa.PureLocal.Conversions + Ypa.BuyerPricer.Conversions; } }
            // ... plus a bunch of other properties I haven't touched yet
        }

public ObservableCollection<SummaryTotalRecord> SummaryTotals = new ObservableCollection<SummaryTotalRecord>();

我发现其他人也有类似的问题,接受的修复似乎是这样的

RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}}

但无论是那个,还是 x:Type ListItem 似乎都不会产生任何结果差异。

更新: 尝试新方法,结果相似。我已经将我的 class 更改为 return 一个名为 TableData 的 DataTable 并修改了 XAML ,如下所示:

<Expander IsExpanded="True" Header="{Binding Date, StringFormat=\{0:MM/dd/yyyy\}}">
                        <DataGrid DataContext="{Binding Path=TableData}" AutoGenerateColumns="True" />
                    </Expander>

相似的结果:

Expander 可以访问 Date 属性,但它包含的 DataGrid 不能访问 TableData?

我最终向绑定对象添加了一个新的 属性:

public 数据表表数据 { 得到 { var table = new DataTable();

                table.Columns.Add("Date", typeof (string));
                table.Columns.Add("Gross Revenue", typeof(string));
                table.Columns.Add("Our Revenue", typeof(string));
                table.Columns.Add("Cost", typeof(string));
                table.Columns.Add("Profit", typeof(string));
                table.Columns.Add("ROI", typeof(string));
                table.Columns.Add("RPC", typeof(string));
                table.Columns.Add("Clicks", typeof(long));
                table.Columns.Add("Conversions", typeof(long));
                table.Columns.Add("Conversion Rate", typeof(string));

                table.Rows.Add(
                    Date.ToString("MM/dd/yyyy"),
                    GrossRevenue.ToString("C"),
                    OurRevenue.ToString("C"),
                    Cost.ToString("C"),
                    Profit.ToString("C"),
                    Roi.ToString("P"),
                    Rpc.ToString("P"),
                    Clicks,
                    Conversions,
                    ConversionRate.ToString("P")
                );

                return table;
            }
        }

此时以下 XAML 有效:

<DataGrid ItemsSource="{Binding Path=TableData}" AutoGenerateColumns="True" 
CanUserAddRows="False" />

我仍然不知道为什么原始代码失败而此代码有效。

网格为什么是空的,这是完全有道理的;它不受任何集合的约束。如果没有指定来源,则有 none,网格将为空。这不是绑定引擎可以推断的东西。