是否可以在不更新后备变量/属性的情况下绑定到数据网格的选定项?



所以,我有一个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绑定到付款对象的观察力。

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... }
    }
}

您可以看到,每笔付款都有一个属性,该属性是预订对象的列表,显示了每个付款的分配方式。

预订对象很简单。

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。

我知道我可以将SelectionItem属性与ViewModel中的属性联系起来,并在每次更改属性时都会通知我的视图,但是似乎DataGrid 2应该知道DataGrid 1的SelectionItem属性已自动更改。我问太多了,还是我只是做错了?

确保预订的属性是公开的。

您可能还需要使用intudatesOurCetrigger = property changing insectionItem绑定中的属性,如:

ItemsSource="{Binding SelectedItem.Bookings, ElementName=dataGrid, UpdateSourceTrigger=PropertyChanged}"

如果这无济DataGrid2通过DataGrid1的SelectionChanged EventHandler

从WPF中的列表中管理亲子选择的三种常见方法

  1. 使用儿童网格的绑定中的"/"语法
  2. 在ViewModel中专门添加SelectedItem属性,将其设置在父母网格并在孩子网格中阅读
  3. 声明将父网格绑定到Collection ViewSource并设置当经过当前的事件的事件时,儿童电网的数据源CollectionViewSource开火。

选项 2 是最常见的。就个人而言,我更喜欢使用 3 ,因为它使我能够在我的ViewModel中移动fert/last/next/上一个。

您似乎正在寻找 1 ,这是最简单的方法,但也是最不强大的方法。您需要做的就是将您在孩子网格中的绑定更改为

<DataGrid ItemsSource="{Binding Payments/Bookings}" AutoGenerateColumns="True" />

请注意,我删除了元素名称,这是错误的;您要绑定到数据tacontext,而不是父级网格上的属性。

最新更新