【问题标题】:When I refresh a datagrid, the "selected values" don't change until the second click当我刷新数据网格时,“选择的值”直到第二次点击才会改变
【发布时间】:2020-10-13 18:11:05
【问题描述】:

我有一个数据网格,当我选择一条线时,它将更新另外两个数据网格。它在初始负载上运行良好。但是当我选择刷新按钮并在 MVVM 模型中重新加载项目源时,Selection Changed 标志直到第二次选择后才会触发。

Visual Studio 2019,c#,MVVM 格式的 WPF,使用 Dapper 和 Caliburn.Micro

ShellView 模型:按钮逻辑

        public void BTN_RefreshHoldOrder()
        {
           CheckIfRefreshing = 1; 
           DG_HoldOrders.Clear();
           DG_HoldOrders = LoadDataGridHoldOrders();
 
            // Added these two lines to see if it would help the selected line value to auto change on first click       
           SelectedHoldOrder = DG_HoldOrders[0];
           SelectedHoldOrderIndex = 0;

// next 2 line manual reload of second table to get it to respond
            DG_Notes.Clear();
            DG_Notes = LoadDataGridNotes(SelectedOrderNoteId, SelectedCustNoteId, SelectedCustomerId, SelectedOrderNumber);

            CheckIfRefreshing = 1;

        }

此按钮重新加载数据网格的 DG_HoldOrders Bindable 集合。 ShellView 数据网格在这里

 <DataGrid ItemsSource="{Binding Path=DG_HoldOrders, Mode=OneWay}" 
                  Grid.Row="3" 
                  Grid.RowSpan="1"
                  Grid.Column="1" 
                  Grid.ColumnSpan="8"
                  AutoGenerateColumns="False"
                  CanUserAddRows="False"
                  SelectedValue="{Binding Path=SelectedHoldOrder, Mode=OneWayToSource}" 
                  SelectedIndex="{Binding Path=SelectedHoldOrderIndex, Mode=TwoWay}" 
             
                  SelectionMode="Single"
                  Name="DG_HoldOrder" Loaded="DG_HoldOrder_Loaded"
                  >

选定的值被推回 SelectedHoldOrder。 发生这种情况时,它会更新其他数据网格

 private HoldOrder _selectedHoldOrder = new HoldOrder();
public HoldOrder SelectedHoldOrder
        {
            get 
            { 
                return _selectedHoldOrder; 
            }
            set 
            { 
                _selectedHoldOrder = value;
               //var TestNotes = new BindableCollection<HoldOrder>();
                if (CheckIfRefreshing == 0)
                {
                                     
                    
                    if (SelectedHoldOrder.SOID.ToString() != null)
                    {

                        SelectedCustNoteId = SelectedHoldOrder.CustomerNoteId;
                        SelectedCustomerId = SelectedHoldOrder.CustomerID.ToString();
                        SelectedOrderNoteId = SelectedHoldOrder.OrderNoteId;
                        SelectedOrderNumber = SelectedHoldOrder.SONumber;

                        DG_Notes.Clear();

                        var TestNotes = LoadDataGridNotes(SelectedOrderNoteId, SelectedCustNoteId, SelectedCustomerId, SelectedOrderNumber);

                        DG_Notes = TestNotes;
                        SelectedNotesIndex = 0;

                        DG_Contacts.Clear();
                        DG_Contacts = LoadDataGridContacts(SelectedCustomerId);
                        SelectedContactIndex = 0;
                    }

                }
                
                NotifyOfPropertyChange(()=>SelectedHoldOrder);
                CheckIfRefreshing = 0;
            }
        }

在初始加载时效果很好。 The initial index is preselected to 0. When select the next line the other two table refresh.在我点击刷新按钮之后。索引重置为 0。我单击下一行没有任何反应。然后我单击另一行,一切都正确刷新。然后我工作,直到我再次单击刷新。看起来所选值最初没有正确设置,并且第一次轻弹第一次设置它。我想尽量保持 MVVM 格式,尽可能不使用后面的代码。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    在 XAML 中添加 IsSynchronizedWithCurrentItem = true。如果为 true,这将使选定项与当前项保持同步。

    https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.primitives.selector.issynchronizedwithcurrentitem?view=netcore-3.1

    <DataGrid ItemsSource="{Binding Path=DG_HoldOrders, Mode=OneWay}" 
                  Grid.Row="3" 
                  Grid.RowSpan="1"
                  Grid.Column="1" 
                  Grid.ColumnSpan="8"
                  AutoGenerateColumns="False"
                  CanUserAddRows="False"
                  SelectedValue="{Binding Path=SelectedHoldOrder, Mode=OneWayToSource}" 
                  SelectedIndex="{Binding Path=SelectedHoldOrderIndex, Mode=TwoWay}" 
                  IsSynchronizedWithCurrentItem="True"
                  SelectionMode="Single"
                  Name="DG_HoldOrder" Loaded="DG_HoldOrder_Loaded"
                  >
    

    【讨论】:

    • 谢谢,我加了代码还是一样的症状。
    • 我认为这是解决方案的一部分,但是现在加载页面时不会填充子数据网格。我仍然缺少一些东西。
    【解决方案2】:

    在“刷新”按钮逻辑中,我没有关闭“检查是否刷新”选项,因此在第一次单击完成并重置值之前,部件不会运行。

    CheckIfRefreshing = 1;
    
    <refresh logic>
    
    CheckIfRefreshing = 0;
    

    IsSynchronizedWithCurrentItem="True" 逻辑使问题变得更糟,因此我将其删除。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多