簡體   English   中英

將DataGrid綁定到第二個數據網格WPF Caliburn.Micro的selectedrow對象

[英]Bind a DataGrid to the selectedrow object of a second datagrid, WPF Caliburn.Micro

我有一個綁定到BindableCollection的數據網格,該網格正常運行,我添加到BindableCollection的每個維修訂單都在Datagrid中顯示。

我在“ WriteOffs”的同一視圖上有第二個Datagrid,每個“ RepairOrder”都有BindableCollection的屬性。

我正在嘗試將WriteOff DataGrid綁定到所選行的WriteOffs。 因此,每次用戶在“ RepairOrder”數據網格中選擇一行時,都會在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方法中,我似乎找不到找到獲取值的方法。

我似乎找不到關於如何處理這種情況的清晰教程或帖子。

實現最終目標的最簡單方法是什么?

好的,這就是我要做的方式...

代替SelectedIndexScheduleGrid 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()方法,使其具有一些king, string, int...參數,並在其中過濾數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM