C# Windows 10 uwp列表视图选择已更改,无法工作
Windows 10 uwp应用程序,具有仅列出字符串的listview。首先,我的xaml代码中有一个可观察的字符串集合。因为我仍然不理解xaml中正确的数据绑定,所以我目前正在通过对可观察集合执行foreach循环,然后执行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一样简单 但我的主要问题是,我想知道用
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;
}