代码之家  ›  专栏  ›  技术社区  ›  Mike Schall

Silverlight DataGrid在设置ItemSource/coDataContext、排序、,

  •  4
  • Mike Schall  · 技术社区  · 17 年前

    有没有办法关闭Silverlight内置DataGrid中第一行的自动选择?

    我们基于用户在数据网格中选择一行来构建许多功能。当数据绑定或排序时,SelectionChanged的自动触发确实给我们带来了问题。我们试图在选择球员时安排一些后卫,但似乎无法解决所有问题。

    例如,如果在加载屏幕时未显示的TabControl的选项卡中有DataGrid,并且DataGrid绑定到DataContext的一个属性,即对象列表。在显示选项卡之前,网格不会进行数据绑定。是否有事件告诉我们网格正在进行数据绑定?数据绑定的默认行为不应该是不选择行吗?

    谢谢 麦克风

    5 回复  |  直到 17 年前
        1
  •  3
  •   ptio    17 年前

    您是否尝试过在用户控件的构造函数中将布尔字段(例如bool dataGridFirstLoad)设置为false。

    然后在DataGrid的SelectionChanged事件中,检查dataGridFirstLoad是否为false。如果将false设置为true,并将SelectedItem设置为null。

    希望这能有所帮助。

        2
  •  1
  •   Scott    17 年前

    迈克,

    我通过包装窗口控件并捕获包装窗口网格的选择更改事件来解决了这个问题。

    在控件中,连接控件的Loaded事件,并在加载时将布尔私有成员变量设置为true。然后,当您捕获内部数据网格的选择更改事件时,只有在控件已加载的情况下,才能引发您自己的选择更改。完成此操作后,您现在可以返回到OnApplyTemplate子目录,并将内部数据网格的选定索引设置为-1,将选定项设置为无。由于索引和项的设置将在控件加载完成之前进行,因此选择更改事件不会触发。我在标签和非标签环境中都尝试过这个方法,它似乎没有问题。现在来看一个更难的问题,您可能已经注意到,当您对窗口数据网格进行排序时(当它是绑定到Items Source的数据时),它总是选择显示数据的顶部项目。当然,这将触发选择更改事件,并移动到以前未选择的项目,据我所知,该项目不应被选择。为了处理这个问题,你必须做一些更棘手的编码。如果您注意到,当您捕获内部网格的选择更改事件并查看其选定项目时,只有少数情况下选定项目未设置为任何值,即当不再选择项目时(即选择被清除),或者当(HINT)列正在排序时。排序时,会触发两个事件,第一个是取消选择项目(SelectedItem为Nothing),第二个是选择列表中的顶部项目(SelectedIndex 0)。现在,如果你在内部网格选择更改事件的事件处理程序中放置一个标志,并捕捉到该项为空的事实,你可以跟踪之前选择的项,然后将内部数据网格的选定项设置为之前选择的项目。

    这很好地解决了这个问题,并且在包装窗口控件时可能会出现不希望的结果,但据我所知,这似乎是解决加载时选择第一行问题的唯一方法。然而,我只能想象,在某个时候,这将被固定在M美元。

    我希望这能有所帮助,

    谢谢,

    斯科特

        3
  •  1
  •   AlignedDev    17 年前

    这与上面的帖子类似(并分析了Paulo T的建议)。这很有效。 //在xaml或构造函数中设置selectionchanged处理程序 //我的页面上有两个网格,所以我为每个网格创建了一个布尔属性

    private bool IsFirstLoad { get; set; }
    private bool IsFirstLoadDetails { get; set; }
    public BookDisplay()
    {
      //code here
      this.IsFirstLoad = true;
      this.IsFirstLoadDetails = true;
      BindBooks(); //define this function (not in this snippet for the sake of brevity)
    }
    private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
      if (this.IsFirstLoad)
      {
        GridBooks.SelectedItem = -1;
        this.IsFirstLoad = false;
      }
      else
      {
        //do your stuff
      }
    }
    private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
      if (this.IsFirstLoadDetails)
      {
         GridBooksWithDetails.SelectedItem = -1;
         this.IsFirstLoadDetails = false;
      }
    }
    
        4
  •  0
  •   Frank Paepens Frank Paepens    17 年前

    下面的代码应该可以做到这一点(每当更新/刷新网格时,将JustRefreshed设置为true):

     int LastSelectedIndex = -1;
     bool JustRefreshed = false;
    
            private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (JustRefreshed)
                {
                    JustRefreshed = false;
                    dataGrid.SelectedIndex = LastSelectedIndex;
                    return;
                }
                if (e.AddedItems.Count > 0)
                {
                    LastSelectedIndex = dataGrid.SelectedIndex;
                            }    
                    //Your logic comes here...
                }
            }
    
        5
  •  0
  •   Mike Schall    16 年前

    由于DataGrid的代码可以从微软获得,我们删除了选择,所以我们不必绕过它。我相信这不再是Silverlight 3.0网格的问题。

    推荐文章