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

时间:2018-02-03 00:26:05

标签: c# wpf data-binding datagrid caliburn.micro

我有一个绑定到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方法,我似乎找不到获取值的方法。

我似乎无法找到关于如何处理这种情况的明确教程或帖子。

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

1 个答案:

答案 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,我们还需要两个ScheduleGridCollection应该有 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()); 并在其中过滤您的数据。