我有一些嵌套控件似乎没有正确地继承绑定......或者它可能完全不同。我对WPF有点新鲜。
我有一个绑定到ListBox的对象的ObservableCollection,并且在顶级,这似乎正在工作,因为按照预期为集合中的每个项添加了一行。问题是我需要在ListBox的ItemTemplate和...
中放置一个DataGrid
我得到的是标题,我手动指定。没有来自绑定对象的数据。
我可能只是做了一些愚蠢的事。这是代码,略有简化:
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>
类似的结果:
Expander可以访问Date
属性,但它包含的DataGrid无法访问TableData
?
答案 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)
为什么网格是空的是完全合理的;它不受任何收藏的约束。如果未指定源,则没有,并且网格将为空。这不是绑定引擎可以推断的东西。