【发布时间】:2017-05-30 14:54:17
【问题描述】:
所以,我有一个显示付款列表的 DataGrid。
<DataGrid x:Name="dataGrid" ItemsSource="{Binding Payments}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="PaymentDate" Binding="{Binding PaymentDate, StringFormat=\{0:d\}}" />
<DataGridTextColumn Header="Amount" Binding="{Binding Amount, StringFormat=\{0:N\}}" />
<DataGridTextColumn Header="Comment" Binding="{Binding Comment}" />
<DataGridTextColumn Binding="{Binding EventCode}" Header="Event Code"/>
<DataGridTextColumn Binding="{Binding DueDate, StringFormat=\{0:d\}}" Header="DueDate"/>
</DataGrid.Columns>
</DataGrid>
此 DataGrid 绑定到 Payment 对象的 ObservableCollection。
public class Payment
{
public Guid ID { get; set; }
public DateTime PaymentDate { get; set; }
public decimal Amount { get; set; }
public string Comment { get; set; }
public string EventCode { get; set; }
public DateTime? DueDate { get; set; }
List<Booking> Bookings
{
get { ...magic that retrieves booking info... }
}
}
如您所见,每笔付款都有一个属性,它是一个 Booking 对象列表,显示每笔付款的分配方式。
Booking 对象非常简单。
public class Booking
{
public string EventCode { get; set; }
public decimal Amount { get; set; }
public DateTime? BookingDate { get; set; }
public string Designation { get; set; }
public string Comment { get; set; }
}
我还有第二个 DataGrid,它应该显示选定付款的预订对象列表。
<DataGrid ItemsSource="{Binding SelectedItem.Bookings, ElementName=dataGrid}" AutoGenerateColumns="True" />
我的预期是,每当我在 DataGrid 1 中选择一个付款项目时,DataGrid 2 都会填充有关如何分配付款的详细信息。然而,我得到的是一个空的详细信息 DataGrid。
我知道我可以将 SelectedItem 属性绑定到我的 ViewModel 中的一个属性,并在每次更改该属性时通知我的视图,但似乎 DataGrid 2 应该知道 DataGrid 1 的 SelectedItem 属性已自动更改。是我要求太多,还是我做错了?
【问题讨论】:
-
你描述的应该没问题,但魔鬼在细节中。试试这个,看看你在运行时在 VS 输出窗格中看到什么,当你改变主网格中的选择时:
ItemsSource="{Binding SelectedItem.Bookings, ElementName=dataGrid, PresentationTraceSources.TraceLevel=High}" -
您是否仔细检查了所选项目的预订列表是否为空?给定代码看不到错误
-
如果两个 DataGrid 位于相同的命名范围内,则应该可以工作。确保已填充所选付款的 Bookings 集合。
-
你可以代替 ElmentName 尝试使用 x:Reference stackoverflow.com/questions/19244111/…
-
噢,我真是个笨蛋。我没有公开我的 Bookings 属性。谢谢你的眼睛,伙计们。我以前从未使用过
PresentationTraceSources.TraceLevel=High。感谢您提供新工具。