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
.
为您提供所选项目,也就是字符串
首先,启用您的 ListView1
的 IsItemClickEnabled
。将其从 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;
}
Windows 10 个带有列表视图的 uwp 应用程序,仅列出字符串。首先,我的 xaml 代码后面有一个可观察的字符串集合。因为我仍然不了解 xaml 中的正确数据绑定,我目前正在通过对可观察集合执行 foreach 循环然后执行
将字符串添加到 tje listviewListview1.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
.
首先,启用您的 ListView1
的 IsItemClickEnabled
。将其从 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;
}