无法将SelectedIndex设置为“”;0”;在Xaml到ListView(Windows应用商店应用程序)中
本文关键字:Windows ListView 应用 应用程序 SelectedIndex 设置 Xaml | 更新日期: 2023-09-27 18:20:44
我有两个ListViews和一个TextBlock。第一个ListView1包括按字母顺序排列的字母。第二个ListView2包含以所选字母开头的单词(在ListView1中)。当我从ListView1中选择一个字母,然后单击ListView2中加载的单词时,我想在TextBlock中获得这个单词的定义。
这是我的Xaml:
<ListView
Width="510"
x:Name="ListView1"
ItemsSource="{Binding}"
Background="White"
Foreground="Black"
TabIndex="1"
Margin="-7,8,0,0"
IsSwipeEnabled="False"
SelectionChanged="ItemListView_SelectionChanged"
Grid.Row="1"
HorizontalAlignment="Left">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Grid.Row="0"
Text="{Binding glossary_letter}"
Margin="10,0,0,0"
TextWrapping="Wrap"
Foreground="Black"
FontSize="24"
FontWeight="SemiBold"
VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView Width="361"
x:Name="ListView2"
Background="White"
Foreground="Black"
Margin="425,8,230,0"
Grid.Row="1"
HorizontalAlignment="Center"
ItemsSource="{Binding}"
SelectionChanged="itemListView2_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Grid.Row="1"
TextWrapping="Wrap"
Foreground="Black"
Text="{Binding}"
FontSize="24"
FontWeight="SemiBold"
VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel HorizontalAlignment="Right"
Background="White"
Width="580"
Margin="0,10,0,0" Grid.Row="1" Grid.ColumnSpan="2">
<TextBlock x:Name="defBlock" Foreground="Black" Text="{Binding glossary_definition}"></TextBlock>
</StackPanel>
如果我第一次点击一个字母(ListView1),然后点击一个单词(ListView2),它会显示定义。然而,当我第二次点击一封信时,它会给我一个OutOfRange
错误,其中ListView2.SelectedIndex = -1
这是我的C#代码:
private void ListView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListView2.ItemsSource = arrayW[ListView1.SelectedIndex];
}
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];
}
知道我犯了什么错误吗?
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(ListView2.SelectedIndex >= 0){
defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];
}
else
{
defBlock.Text = arrayDef[ListView1.SelectedIndex][0];//set default selected word..
}
}
问题
您需要管理您的list2选定索引更改处理程序,因为每次更新列表1时,列表2上都会有选定索引更改,并且由于没有选定索引,因此默认为-1。
有很多方法可以做到这一点
1.
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(ListView2.SelectedIndex == -1)
// do something or
// eg.
return;
// or
throw new IndexOutOfRangeException("Message");
//or
throw new Exception(); // catch all
}
2.
我不确定你希望你的应用程序是什么样子。
我会用两个单独的页面。让xaml用于您的第一个列表视图,然后查看第二个页面并将其绑定到第一个页面的选定索引。
因此,在显示list2的新页面中,您可以选择list1,然后更容易地将其设置为数据源,然后您可以使用所选项目的详细信息更新文本框。或者,如果你想显示这个词及其定义的更多细节,可以创建第三个页面。
这样,当数据源发生更改时,您就不会遇到List2没有选定索引的问题。
3.
或从更改了索引的处理程序中取出绑定声明,并在选择了List1中的索引时有条不紊地调用它们。因此,当List1的选择发生更改时,List2也会更新——换句话说,您需要更新您的数据源edit:这是在数据源更新时控制错误处理的使用以避免范围外异常的另一种方法
因此,可以将以下内容放入一个单独的方法中。
private void MyTextMethod(){
defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];
}
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try{
MyTextMethod)();
}
catch(OutOfRangeException){
// do something.
}
}
从所选的索引中更改处理程序,并在处理程序中调用一个单独的方法。
4.
从列表1的选定索引更改处理程序中取出列表2的绑定声明。
因此,您可以有一个方法来更新list2的绑定源,并管理所选的索引更改处理程序。尽管这是最不有用的建议。
底线:您需要进行一些try-and-catch或throw语句来管理范围外异常,因为第二个列表的长度不同,字母as列表上的索引可能选择为10,然后字母X可能只有一个长度为1的列表,并且始终存在selectionchange返回-1的选择的问题。
(您实际上不需要清除list2,它会随着数据源的更改而自动清除(对不起,我没有清除))