【问题标题】:Deselecting item from Silverlight datagrid if it's clicked twice如果单击两次,则从 Silverlight 数据网格中取消选择项目
【发布时间】:2011-03-21 21:01:34
【问题描述】:

我有一个 Silverlight 4.0 数据网格,它的 SelectionMode 设置为 Single。这样做的问题是用户需要按住 CTRL+单击已经选择的行才能取消选择它(并且在网格中没有选择任何内容)。我希望他们能够简单地左键单击已选择的行以取消选择它。

我尝试使用 SelectionChanged 事件(检查事件参数中添加的项目)来执行此操作,但是它不起作用,因为当用户单击同一行两次时不会引发该事件。

有什么建议吗?

【问题讨论】:

  • 没错。用户不能直接编辑网格中的项目。

标签: silverlight datagrid f# silverlight-4.0


【解决方案1】:

无法捕获第二个事件,因为它从未被触发。您可以做的是将此项目中使用的自定义类型应用于确实捕获第二次点击并根据需要再次触发事件的自定义类型:

http://www.codeproject.com/KB/silverlight/doubleClickDataGridSL.aspx

【讨论】:

    【解决方案2】:

    我有同样的任务,所以这是我的解决方案: 使用 AddHandler dataGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(DataGrid_MouseLeftButtonDown), true) 为 datagrid 的 MouseLeftButtonDown 事件附加处理程序; , 将 SelectedIndex 保存在私有变量中

        private int prevSelectedIndex;
        void DataGrid_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (prevSelectedIndex != -1 && prevSelectedIndex == dataGrid.SelectedIndex)
            {
                dataGrid.SelectedIndex = -1;
            }
            prevSelectedIndex = dataGrid.SelectedIndex;
        }
    

    如果你想重用这个逻辑,你可以为 DataGrid 类型创建行为

    添加 System.Windows.Interactivity 程序集引用,添加类 DataGridSecondClickUnselectBehavior

    public class DataGridSecondClickUnselectBehavior : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
    
            AssociatedObject.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown), true);
        }
    
        private int prevSelectedIndex;
        void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (prevSelectedIndex != -1 && prevSelectedIndex == AssociatedObject.SelectedIndex)
            {
                AssociatedObject.SelectedIndex = -1;
            }
            prevSelectedIndex = AssociatedObject.SelectedIndex;
        }
    
        protected override void OnDetaching()
        {
            base.OnDetaching();
    
            AssociatedObject.RemoveHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown));
        }
    }
    

    现在,在 blend 中编译解决方案后,您可以简单地将这个行为从 Assets->Behaviors 拖放到 DataGrid 控件中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 2014-05-06
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2011-04-26
      相关资源
      最近更新 更多