将 DataGrid 绑定到第二个数据网格 WPF Caliburn.Micro 的 selectedrow 对象



我有一个绑定到可绑定集合的数据网格,它工作正常,我添加到可绑定集合的每个修复订单都会显示在数据网格中。

我在"注销"的同一视图上有第二个数据网格,每个"修复订单"都有一个可绑定集合的属性。

我正在尝试做的是将注销数据网格绑定到所选行的注销。因此,每次用户在"RepairOrder"数据网格中选择一行时,注销属性中存储的注销都会显示在注销数据网格中。

处理此问题的最佳方法是什么?

维修订单类别:

public string ControlNumber { get; set; }
public double Value { get; set; }
public string Note { get; set; }
public string Schedule { get; set; }
public int Age { get; set; }
public List<WriteOff> WriteOffs { get; set; }

public RepairOrder(string CN, string SC, double VL)
{
ControlNumber = CN;
Schedule = SC;
Value = Math.Round(VL,2);
Note = null;
WriteOffs = new List<WriteOff>();
}
public RepairOrder()
{
}
public void AddWriteOff(WriteOff WO)
{
WriteOffs.Add(WO);
}
public BindableCollection<WriteOff> GetWriteOffs()
{
BindableCollection<WriteOff> temp = new BindableCollection<WriteOff>();
foreach (var item in WriteOffs)
{
temp.Add(item);
}
return temp;
}
public static RepairOrder FromCSV(string CSVLine, string Sched)
{
string[] values = CSVLine.Split(',');
RepairOrder rep = new RepairOrder();
rep.ControlNumber = values[2];
rep.Value = Math.Round(double.Parse(values[5]),2);
rep.Age = int.Parse(values[4]);
rep.Schedule = Sched;
return rep;
}

显示维修订单的数据网格的 XML:

<Border BorderBrush="Black" BorderThickness="2" CornerRadius="5" Grid.Column="1" Grid.Row="1">
<DataGrid  x:Name="ScheduleGrid" ItemsSource="{Binding RepairOrders}" CanUserSortColumns="True" AutoGenerateColumns="False" SelectedIndex="{Binding SelectedRepairOrder}" SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Header="Schedule" Binding="{Binding Schedule}" Width="75" IsReadOnly="True"/>
<DataGridTextColumn Header="Control Number" Binding="{Binding ControlNumber}" Width="110" IsReadOnly="True"/>
<DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="50" IsReadOnly="True"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value, StringFormat=C}" Width="75" IsReadOnly="True"/>
<DataGridTextColumn Header="Note" Binding="{Binding Note}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Border>

用于注销的数据网格的 XML:

<Border Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" BorderBrush="Black" BorderThickness="2" CornerRadius="5" Margin="5,2,5,5">
<StackPanel Orientation="Vertical">
<TextBlock Text="Write Off List" HorizontalAlignment="Center" FontSize="20"/>
<DataGrid ItemsSource="{Binding WriteOffs}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Account" Binding="{Binding Account}" Width="100" IsReadOnly="True"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description}" Width="200" IsReadOnly="True"/>
<DataGridTextColumn Header="Amount" Binding="{Binding WriteOffAmount}" Width="*" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Border>

我正在考虑在用户选择一行时创建一个事件,但是如果所选行进入ViewModel方法,我似乎找不到获取值的方法。

我似乎找不到关于如何处理这种情况的清晰教程或帖子。

实现最终目标的最简单方法是什么?

好的,这就是我会做的方式...

您需要使用SelectedItem而不是ScheduleGrid DataGridSelectedIndex。 因此,您的XAML如下所示:

<DataGrid  x:Name="ScheduleGrid" ItemsSource="{Binding RepairOrders}" SelectedItem="{Binding SelectedRepairOrder} ...."

ViewModel现在您需要将SelectedItem属性或SelectedRepairOrder. 该属性应如下所示:

private RepairOrder _selectedRepairOrder;
public RepairOrder SelectedRepairOrder
{
get { return _selectedRepairOrder; }
set
{
if (_selectedRepairOrder == value) return;
_selectedRepairOrder = value;
NotifyOfPropertyChange(() => SelectedRepairOrder);
NotifyOfPropertyChange(() => WriteOffsCollection);
}
}

其次,由于我们有两个DataGrids我们也需要两个CollectionsScheduleGrid应该有一个看起来像这样的Collection

private BindableCollection<RepairOrder> _repiarOrdersCollection;
public BindableCollection<RepairOrder> RepairOrders
{
get { return _repiarOrdersCollection; }
set
{
_repiarOrdersCollection = value;
}
}

WriteOffs DataGrid集合应该是这样的:

public BindableCollection<WriteOff> WriteOffs
{
get
{
return GetWriteOffs();
}
}

好。。。现在会发生什么...正如您在SelectedRepairOrder属性中看到的那样,在它更改后,它将通知您的WriteOffs集合它已更改。而且由于我们是较新的 设置其DataGrid的值 ,我们不需要任何setter. 现在缺少一件事。既然您有两个集合,我相信您想在一个集合中选择项目后过滤其他集合上的项目吗?右?如果是,您需要扩展GetWriteOffs()方法,以具有一些国王,string, int...的参数,并在其中过滤您的数据。

最新更新