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,网格将为空。这不是绑定引擎可以推断的东西。
我有一些嵌套控件似乎没有正确继承绑定...或者它可能完全是其他东西。我对 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,网格将为空。这不是绑定引擎可以推断的东西。