我有一个绑定到BindableCollection的数据网格,这个工作正常,我添加到BindableCollection的每个修复顺序都显示在Datagrid中。
我在" WriteOffs",每个" RepairOrder"的同一视图上有第二个Datagrid。具有BindableCollection的属性。
我要做的是将WriteOff DataGrid绑定到所选行的WriteOffs。因此,每次用户在" RepairOrder"中选择一行时datagrid存储在writeoff属性中的写入关闭显示在WriteOff数据网格中。
处理此问题的最佳方法是什么?
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方法,我似乎找不到获取值的方法。
我似乎无法找到关于如何处理这种情况的明确教程或帖子。
实现我最终目标的最简单方法是什么?
答案 0 :(得分:0)
好的,这就是我要做的......
而不是SelectedIndex
ScheduleGrid DataGrid
,而不是SelectedItem
,您需要使用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
其次,由于我们有两个Collections
,我们还需要两个ScheduleGrid
。
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...
方法,以获得某些王的参数,Integer.parseInt (editText1.getText().toString());
并在其中过滤您的数据。