ListBox ItemTemplate中的DataGrid不继承绑定?

时间:2015-07-09 21:08:38

标签: c# wpf xaml datagrid listbox

我有一些嵌套控件似乎没有正确地继承绑定......或者它可能完全不同。我对WPF有点新鲜。

我有一个绑定到ListBox的对象的ObservableCollection,并且在顶级,这似乎正在工作,因为按照预期为集合中的每个项添加了一行。问题是我需要在ListBox的ItemTemplate和...

中放置一个DataGrid

DataGrids with headers only

我得到的是标题,我手动指定。没有来自绑定对象的数据。

我可能只是做了一些愚蠢的事。这是代码,略有简化:

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似乎都没有产生任何结果差异。

更新:尝试使用类似结果的新方法。我已经更改了我的类以返回名为TableData的DataTable并修改了XAML,如下所示:

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

类似的结果:

Expanders can access but DataGrids can't?

Expander可以访问Date属性,但它包含的DataGrid无法访问TableData

2 个答案:

答案 0 :(得分:1)

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

public DataTable TableData             {                 得到                 {                     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" />

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

答案 1 :(得分:0)

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