【问题标题】:How to programmatically deselect a ListViewItem in c++/cx?如何以编程方式取消选择 C++/cx 中的 ListViewItem?
【发布时间】:2014-01-24 06:04:56
【问题描述】:

我有一个ListView,在 XAML 中将 SelectionMode 设置为 Single,并希望在代码隐藏中以编程方式取消选择所选项目,我试图通过 MenuFlyout->Closed 事件处理程序中的这一行来完成(每个ListViewItem 都附有一个MenuFlyout):

NotationListView->SelectedIndex = -1;

很遗憾,这不起作用并且应用程序崩溃了。任何其他值都有效并选择相应的ListViewItem,但-1 并没有达到我的预期。

我该怎么做?

编辑:我目前的解决方法

ListView 的 XAML 定义(缩短):

<ListView x:Name="NotationListView" 
    SelectionMode="None" 
    IsItemClickEnabled="True" 
    ItemClick="NotationListView_ItemClicked"/>

NotationListView_ItemClicked() 的 C++/CX 定义(缩写):

ListViewItem^ item = (ListViewItem^) ((TextBlock^) e->ClickedItem)->Parent;
item->Foreground = ref new SolidColorBrush(Colors::Green);
Flyout::ShowAttachedFlyout(item);
selectedItem = item;

selectedItem 只是在存储所选项目的 xaml.h 文件中声明的变量。这样,我可以在MenuFlyoutItems 的 Click-EventHandlers 中轻松使用它。 现在您可能会注意到,我没有任何方法可以访问我迫切需要的单击项目的索引。但是因为所有ListViewItems 都是以编程方式创建的,所以我可以将其添加到创建的末尾:

auto items = NotationListView->Items;
Box<unsigned int>^ indexBox = ref new Box<unsigned int>(items->Size);
item->Tag = indexBox;
items->Append(item);

现在我只需使用该行即可获得每个项目的索引

unsigned int i = ((Box<unsigned int>^)selectedItem->Tag)->Value;

NotationFlyout_Closed()的C++/CX定义:

这很简单。

if (selectedItem){
    selectedItem->Foreground = ref new SolidColorBrush(Colors::Black);
    selectedItem = nullptr;
}

【问题讨论】:

    标签: windows windows-8 windows-store-apps winrt-xaml c++-cx


    【解决方案1】:

    您需要的属性取决于您实现 ListView 的方式。此外,请确保您使用了正确的设置。

    来源 - http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listview.aspx

    【讨论】:

    • 抱歉,忘了说我使用的是单选模式。我已经能够使用NotationListView-&gt;SelectedIndex = 5; 以编程方式选择一个项目,但取消选择对我来说是个问题。不过,感谢您的回答。
    • 这对你有用吗? NotationListView->SelectedIndex = -1;如果您需要取消选择项目,您可能还必须使用 NotationListView->SelectedItem = null。
    • 不,我都试过了,都让应用程序崩溃。不过,我找到了解决方法。我在 XAML 中将 SelectionMode 设置为 None 并使项目可点击。在ItemClicked 事件处理程序中,我将单击的项目保存到一个变量中,并将其前景设置为不同的颜色以显示哪个项目被选中。因为ListViewItems 是以编程方式创建的,所以我可以将它们的Tag 属性设置为Vector&lt;int&gt;^ 来存储它们的索引。当弹出关闭时,我只需要将前景再次设置为黑色。这不是最好的方法,但看起来不错并且工作正常。我应该将此作为答案发布吗?
    【解决方案2】:

    我希望ListView-&gt;Refresh() 可能会做这样的事情,但可惜,不。

    相反,我必须重新填充整个 ListView 以重置选择,因为它不是本机可修改的属性。 (为什么?)

    listView1->Items->Clear();
    
    ListViewItem^  listViewItem1 = (gcnew ListViewItem(gcnew cli::array< String^  >(2)
    {
        L"Column 1",
        L"Column 2"
    }, -1));
    ListViewItem^  listViewItem2 = (gcnew ListViewItem(gcnew cli::array< String^  >(2)
    {
        L"Column 1",
        L"Column 2"
    }, -1));
    ListViewItem^  listViewItem3 = (gcnew ListViewItem(gcnew cli::array< String^  >(2)
    {
        L"Column 1",
        L"Column 2"
    }, -1));
    
    listView1->Items->AddRange(gcnew cli::array< ListViewItem^  >(3)
    {
        listViewItem1,
        listViewItem2,
        listViewItem3
    });
    

    您也可以完全动态地执行此操作 - 这只是一个静态示例。

    【讨论】:

    • 也是一种可能的解决方法,但它似乎更耗费资源,尤其是当列表变得更长时。理论上,它是如上所述的可修改属性。应该可以将SelectedIndex 属性设置为-1,但显然这不起作用。
    • 同意。有很多基本的东西在他们应该访问的时候没有属性访问。
    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2014-04-05
    • 2019-03-21
    相关资源
    最近更新 更多