如何以编程方式取消选择c ++ / cx中的ListViewItem?

时间:2014-01-06 18:27:46

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

我在XAML中将ListView 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文件中声明的变量,用于存储所选的Item。这样,我可以在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;
}

2 个答案:

答案 0 :(得分:1)

您需要的属性取决于您如何实现ListView。另外,请确保使用了您想要使用的正确设置。

Table describing how you can use a ListView

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

答案 1 :(得分:0)

我希望ListView->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
});

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