Windows 10 uwp 列表视图选择更改无效

Windows 10 uwp listview selection changed not working

Windows 10 个带有列表视图的 uwp 应用程序,仅列出字符串。首先,我的 xaml 代码后面有一个可观察的字符串集合。因为我仍然不了解 xaml 中的正确数据绑定,我目前正在通过对可观察集合执行 foreach 循环然后执行

将字符串添加到 tje listview
Listview1.Items.Add (new TextBlock {Text = myString});

但是,在这种情况下绑定就像将我的 listview ItemsSource 设置为我的 observablecollection 一样简单吗?

不过,我的主要问题是我想知道用户何时 select 在列表视图中输入了一个字符串,以及他们 select 编辑了什么字符串。因此,我连接到列表视图 SelectionChanged 事件。当我 select 列表中的项目时会引发此事件,但是

 var selectedString = e.AddedItems.First().ToString();

没有给我 selected 字符串值。此外,此事件似乎可能存在递归问题。有一次,我的断点命中了两次,尽管我只 select 编辑了列表视图中的一项。

所以,主要问题是如何从列表视图中获取 selected 字符串,但也希望对数据绑定以及是否可以递归此事件提出建议或意见。

编辑:在尝试了最后两个答案后,我仍然遇到一些问题。我无法获取 selected 的字符串。使用下面的两个答案,我得到相同的结果。首先,有一些递归,因为即使列表只被 selected 一次,事件也确实触发了两次。此外,在这两种情况下,字符串都不会填充 selection。事实上,断点将命中该行,然后跳到事件处理程序方法的末尾,我无法检查任何变量或参数。我什至将它包装在一个 try catch 块中,但它从不运行 try 块中的其余代码,也从不捕获异常。它所做的只是跳到事件处理程序方法的末尾,然后将我带到一个名为 SharedStubs.g.cs 的文件,在那里,它在此方法的末尾命中

        // Signature, Windows.UI.Xaml.UnhandledExceptionEventHandler.Invoke, [rev] [return] [Mcg.CodeGen.ComHRESULTReturnMarshaller] void__int, [rev] [in] [Mcg.CodeGen.WinRTInspectableMarshaller] object____mcg_IInspectable, [rev] [in] [GenericTypeMarshaller]  -> T, 
    [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
    [global::System.Runtime.InteropServices.McgGeneratedMarshallingCode]
    internal static int Proc_object__TArg0__<TArg0>(
                object __this, 
                global::System.Runtime.InteropServices.__vtable_IInspectable* unsafe_sender, 
                void* unsafe_e, 
                global::System.IntPtr __methodPtr)
    {
        // Setup
        object sender = default(object);
        TArg0 TArg0__arg = default(TArg0);
        try
        {
            // Marshalling
            sender = global::System.Runtime.InteropServices.McgMarshal.IInspectableToObject(((global::System.IntPtr)unsafe_sender));
            TArg0__arg = (TArg0)global::System.Runtime.InteropServices.McgModuleManager.ComInterfaceToObject(
                                ((global::System.IntPtr)unsafe_e), 
                                typeof(TArg0).TypeHandle
                            );
            // Call to managed method
            global::McgInterop.Intrinsics.HasThisCall__Proc_object__TArg0__<TArg0>(
                                __this, 
                                __methodPtr, 
                                sender, 
                                TArg0__arg
                            );
            global::System.Runtime.InteropServices.DebugAnnotations.PreviousCallContainsUserCode();
            // Return
            return global::McgInterop.Helpers.S_OK;
        }
        catch (global::System.Exception hrExcep)
        {
            // ExceptionReturn
            return global::System.Runtime.InteropServices.McgMarshal.GetHRForExceptionWinRT(hrExcep);
        }
    }

并且该方法中的发送者是ListView。在它命中此方法后,调试器就会挂起。我从来没有遇到真正的异常或错误,而且它永远不会真正停止。我可以点击继续,但它只是闲置。所以,以上是我真正拥有的唯一线索。不知道为什么这会命中而不是 try/catch 块以及为什么我永远不会得到任何进一步的异常、堆栈跟踪等...

谢谢!

首先,将字符串项绑定到列表视图需要一行代码。您不必为此创建 XAML 模板,因为您没有将 object 与属性绑定。你可以这样做:

Listview1.ItemsSource = YourObservableCollection();

它会将您的 collection 绑定到您的 ListView

关于选择事件,可以用ItemClick事件代替SelectionChanged。事件参数将通过调用 e.ClickedItem.

为您提供所选项目,也就是字符串

首先,启用您的 ListView1IsItemClickEnabled。将其从 false 设置为 true。然后添加 ItemClick 事件。

private void ListView1_ItemClick(object sender, ItemClickEventArgs e)
    {
        e.ClickedItem;
    }

这将 return 选择的值,在您的情况下,string

希望对您有所帮助!

您还可以使用 SelectionChanged 事件来获取用户选择的值。 代码如下所示:

在 XAML 中:

ListView Name="sourceList"
         ItemsSource="{Binding itemsource}"
         SelectionChanged="sourceList_SelectionChanged"

在后面的代码中:

private void sourceList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   string selectedSource = Convert.ToString(((ListView)sender).SelectedItem);
}

您使用 SelectedItem 属性 在 ListView 中获取当前选定的项目,并且由于您正在向 Items 集合添加 TextBlock 元素,因此您应该将 SelectedItem 属性 转换为 TextBlock 然后访问其 Text 属性 以获取字符串值:

private void Listview1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    TextBlock textBlock = Listview1.SelectedItem as TextBlock;
    if (textBlock != null)
    {
        string s = textBlock.Text;
    }
}

你能试试这个吗?

    private void Listview1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        TextBlock textBlock = (sender as ListView).SelectedItem as TextBlock;
        string value = textBlock.Text;

        // OR
        string value2 = (e.AddedItems[0] as TextBlock).Text;

        // OR
        string value3 = (e.AddedItems.First() as TextBlock).Text;
    }