C# Windows 10 uwp列表视图选择已更改,无法工作

C# Windows 10 uwp列表视图选择已更改,无法工作,c#,xaml,uwp,windows-10-universal,windows-10-mobile,C#,Xaml,Uwp,Windows 10 Universal,Windows 10 Mobile,Windows 10 uwp应用程序,具有仅列出字符串的listview。首先,我的xaml代码中有一个可观察的字符串集合。因为我仍然不理解xaml中正确的数据绑定,所以我目前正在通过对可观察集合执行foreach循环,然后执行 Listview1.Items.Add (new TextBlock {Text = myString}); 但是,在这种情况下绑定是否像将我的listview ItemsSource设置为observablecollection一样简单 但我的主要问题是,我想知道用

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

Listview1.Items.Add (new TextBlock {Text = myString});
但是,在这种情况下绑定是否像将我的listview ItemsSource设置为observablecollection一样简单

但我的主要问题是,我想知道用户何时在listview中选择字符串,以及他们选择了什么字符串。因此,我连接到listview SelectionChanged事件。但是,当我在列表中选择一个项目时,将引发此事件

 var selectedString = e.AddedItems.First().ToString();
不给我所选的字符串值。此外,此事件似乎存在可能的递归问题。有一次,我的断点击中了两次,尽管我只在listview中选择了一个项目

所以,主要的问题是如何从listview中获取所选字符串,但也希望得到有关数据绑定的建议或注释,以及是否可以使用此事件进行递归

编辑:在尝试了最后两个答案后,我仍然有一些问题。我无法获取所选的字符串。使用下面的两个答案,我得到了相同的结果。首先,有一些递归,因为很明显,即使只选择了一次列表,事件也会触发两次。此外,在这两种情况下,字符串从不填充所选内容。事实上,断点将命中该行,但随后跳到事件处理程序方法的末尾,我无法检查任何变量或参数。我甚至将它包装在一个try-catch块中,但它从未运行try块中的其余代码,也从未捕获异常。它所做的只是跳到事件处理程序方法的末尾,然后把我带到一个名为sharedsubs.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);
        }
    }
//签名,Windows.UI.Xaml.UnhandledExceptionEventHandler.Invoke,[rev][return][Mcg.CodeGen.comHRESULT ReturnMarshaller]void\u int,[rev][in][Mcg.CodeGen.WinRTInspectableMarshaller]object\uuuuuuuuuuuuuuuuuuuuuuuiInspectable,[rev in][GenericTypeMarshaller]>T,
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.NoInLine)]
[全局::System.Runtime.InteropServices.McGeneratedMarshallingCode]
内部静态int Proc\u对象\uuu TArg0__(
反对这个,
全局::System.Runtime.InteropServices.\u vtable\u IInspectable*不安全\u发送方,
无效*不安全,
全局::System.IntPtr\uuu methodPtr)
{
//设置
对象发送方=默认值(对象);
TArg0 TArg0__arg=默认值(TArg0);
尝试
{
//编组
sender=global::System.Runtime.InteropServices.mcgmassmarl.IInspectableToObject(((global::System.IntPtr)unsafe_sender));
TArg0__arg=(TArg0)全局::System.Runtime.InteropServices.McgModuleManager.ComInterfaceToObject(
((全局::System.IntPtr)不安全),
typeof(TArg0).TypeHandle
);
//对托管方法的调用
全局::mcgiinterop.Intrinsics.HasThisCall\uuuuu Proc\u object\uuuuuu TArg0__(
__这个,,
__方法,
发件人,
目标参数
);
global::System.Runtime.InteropServices.DebugAnnotations.PreviousCallContainerCode();
//返回
返回全局::mcgirosop.Helpers.S_OK;
}
捕获(全局::System.Exception hrExcep)
{
//例外申报表
返回global::System.Runtime.InteropServices.McMarshall.GetHRForExceptionWinRT(hrExcep);
}
}
此方法中的发送方是ListView。在使用此方法后,调试器会挂起。我从未遇到过真正的异常或错误,它也从未真正停止过。我可以点击continue,但它只是处于空闲状态。所以,以上是我真正掌握的唯一线索。不确定为什么会命中try/catch块,但不会命中try/catch块,以及为什么我永远不会得到任何进一步的异常、堆栈跟踪等


谢谢

首先,将字符串项绑定到listview需要一行代码。您不必为此创建XAML模板,因为您没有使用属性绑定对象。您可以这样做:

Listview1.ItemsSource = YourObservableCollection();
它会将您的收藏绑定到您的
列表视图

对于选择事件,您可以使用
ItemClick
事件,而不是
SelectionChanged
。事件参数将通过调用
e.ClickedItem
为您提供所选项目,即字符串

首先,启用您的
列表视图1
IsItemClickEnabled
。将其从
false
设置为
true
。然后添加
项单击
事件

private void ListView1_ItemClick(object sender, ItemClickEventArgs e)
    {
        e.ClickedItem;
    }
在您的情况下,这将返回所选的值,即
字符串


希望有帮助

首先,将字符串项绑定到listview需要一行代码。您不必为此创建XAML模板,因为您没有使用属性绑定对象。您可以这样做:

Listview1.ItemsSource = YourObservableCollection();
它会将您的收藏绑定到您的
列表视图

对于选择事件,您可以使用
ItemClick
事件,而不是
SelectionChanged
。事件参数将通过调用
e.ClickedItem
为您提供所选项目,即字符串

首先,启用您的
列表视图1
IsItemClickEnabled
。将其从
false
设置为
true
。然后添加
项单击
事件

private void ListView1_ItemClick(object sender, ItemClickEventArgs e)
    {
        e.ClickedItem;
    }
在您的情况下,这将返回所选的值,即
字符串


希望有帮助

您还可以使用SelectionChanged事件来获取所选的值
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;
    }