我有一个Silverlight 4.0数据网格,其SelectionMode
设置为Single
。这样做的问题是用户需要按CTRL +单击已选择的行以取消选择它(并且在网格中没有选择任何内容)。我希望他们只需左键单击已经选中的行就可以取消选择。
我尝试使用SelectionChanged
事件执行此操作(检查事件参数中添加的项目),但是它不起作用,因为当用户点击同一行两次时不会抛出该事件。 / p>
有什么建议吗?
答案 0 :(得分:0)
无法捕获第二个事件,因为它永远不会被触发。您可以做的是将此项目中使用的自定义类型应用于捕获第二次单击并根据需要再次触发事件的类型:
http://www.codeproject.com/KB/silverlight/doubleClickDataGridSL.aspx
答案 1 :(得分:0)
我有同样的任务,所以这是我的解决方案: 使用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编译解决方案之后,您可以添加此行为,只需将“从资源”拖放到&gt;行为到DataGrid控件