【问题标题】:Unselect GridView.Item on click if already selected如果已选择,请在单击时取消选择 GridView.Item
【发布时间】:2016-03-31 05:17:32
【问题描述】:

我知道这看起来很简单,我也是这么想的,但实际上并非如此。 我有一个带有 SelectionMode="Single" 的 GridView,我想通过单击它来取消选择一个选定的项目。问题是,当您选择已选择的项目时,SelectionChanged 不会触发。我尝试在每个 SelectionChanged 上设置一个等于 GridView 的 SelectedIndex 的 int,然后检查 Grid_Tapped 以查看是否 PreviousSelectedIndex == CurrentSelectedIndex,但 SelectionChanged 事件在 Grid_Tapped 之前触发纳秒,所以它不起作用。有什么想法吗?

【问题讨论】:

    标签: c# xaml windows-store-apps uwp


    【解决方案1】:

    我认为使用这个比延迟更好:

    Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => gridView.SelectedItem = null);
    

    【讨论】:

    • +1 因为它看起来不那么脏并且似乎可以肯定地工作,因为它可能在处理此点击后立即添加到 UI 线程工作队列中。
    【解决方案2】:

    是的,这是一个有点奇怪的默认行为,你可以通过以下技巧来解决这个问题(有很多方法)

    1.- XAML

    <GridView IsItemClickEnabled="True" ItemClick="IconGridView_ItemClick" SelectionMode="Single">
    

    2.- 事件代码:

     private async void IconGridView_ItemClick(object sender, ItemClickEventArgs e)
        {
            var gridView = sender as GridView;
            if (e.ClickedItem == gridView.SelectedItem)
            {
                await Task.Delay(100);
                gridView.SelectedItem = null;
            }
        }
    

    如果您稍等片刻,内部事件会保留选定的项目,这样它就会被解决并且 SelectedItem 被取消选择。

    【讨论】:

    • 你不能使用“e.handled = true”
    【解决方案3】:

    使用CellClick 事件。

    例如,private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)e.RowIndex 保存被点击的单元格的索引。你所要做的就是检查这个索引是否等于SelectedIndex

    【讨论】:

    • 我相信是ItemClick事件。
    猜你喜欢
    • 2011-02-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多