Windows 10 uwp listview选择改变不起作用

时间:2017-02-26 02:23:55

标签: c# xaml uwp windows-10-universal windows-10-mobile

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

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

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

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

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

不给我选中的字符串值。此外,此事件似乎可能存在递归问题。有一次,即使我只在列表视图中选择了一个项目,我的断点也会打两次。

所以,主要问题是我如何从列表视图中获取所选字符串,但也会欣赏有关数据绑定的建议或注释,以及是否可以通过此事件进行递归。

编辑:在尝试了最后两个答案后,我仍然遇到一些问题。我无法获取所选的字符串。使用下面的两个答案,我得到相同的结果。首先,有一些递归,因为很明显,即使只选择一次列表,事件也会激发两次。此外,在这两种情况下,字符串永远不会填充选择。实际上,断点将在该行处命中,但随后跳到事件处理程序方法的末尾,我无法检查任何变量或参数。我甚至将它包装在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块,为什么我永远不会得到任何进一步的异常,堆栈跟踪等......

谢谢!

4 个答案:

答案 0 :(得分:2)

你能试试这个吗?

    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;
    }

答案 1 :(得分:0)

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

Listview1.ItemsSource = YourObservableCollection();

它会将您的收藏绑定到ListView

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

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

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

这将返回您选择的值string

希望它有所帮助!

答案 2 :(得分:0)

您还可以使用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);
}

答案 3 :(得分:0)

您使用ListView属性获取SelectedItem中当前选定的项目,因为您要将TextBlock个元素添加到Items集合中,您应该投射{{1} } {}为SelectedItem的属性,然后访问其TextBlock属性以获取字符串值:

Text