无法将 Xaml 中的 SelectedIndex="0" 设置为 ListView(Windows 应用商店)
Cannot set SelectedIndex="0" in Xaml to ListView (Windows Store App)
我有 2 个 ListView 和一个 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];
}
知道我在做什么错误吗?
问题
您需要管理您的 list2 selected 索引更改处理程序,因为每次您更新列表时,列表 2 都会有一个 selected 索引更改,因为没有 selected 索引它默认为 -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,然后查看第二页并将其绑定到第一页的 selected 索引。
所以 list1,你 select 然后更容易在显示 list2 的新页面中设置为数据源,然后你可以使用 select 中的详细信息更新你的文本框编项目。或者,如果您想显示该词及其定义的更多详细信息,请创建第三页。
这样,当数据源更改时,您的 List2 没有 selected 索引就不会出现问题。
3.
要么,
从索引更改处理程序中取出绑定声明,并在 List1 中的索引为 selected.So 时有条不紊地调用它们,当 List1 的 selection 发生更改时,换句话说,列表 2 已更新,您需要更新您的数据源。 编辑:这是您控制错误处理的使用的另一种方式,以避免在数据源更新时出现超出范围的异常。
所以可能将以下内容放入一个单独的方法中。
private void MyTextMethod(){
defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];
}
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try{
MyTextMethod)();
}
catch(OutOfRangeException){
// do something.
}
}
在您的 selected 索引中更改了处理程序,并在处理程序中调用单独的方法。
4.
从 list1 的 selectedindex 更改处理程序中获取 list2 的绑定声明。
因此您可以使用一种方法来更新 list2 的绑定源并管理 selected 索引更改处理程序。虽然这是最没用的建议。
底线:您需要一些 try 和 catch 或 throw 语句来管理超出范围的异常,因为第二个列表的长度不同,字母 As 列表的索引可能是 selected 为 10,然后字母 X 可能只有长度为 1 的列表,并且总是存在 selectionchange 返回 -1 的 selection 的问题。
(实际上不需要清除list2,随着数据源的改变,它会自动清除(对不起,我没说清楚))
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..
}
}
我有 2 个 ListView 和一个 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];
}
知道我在做什么错误吗?
问题
您需要管理您的 list2 selected 索引更改处理程序,因为每次您更新列表时,列表 2 都会有一个 selected 索引更改,因为没有 selected 索引它默认为 -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,然后查看第二页并将其绑定到第一页的 selected 索引。
所以 list1,你 select 然后更容易在显示 list2 的新页面中设置为数据源,然后你可以使用 select 中的详细信息更新你的文本框编项目。或者,如果您想显示该词及其定义的更多详细信息,请创建第三页。
这样,当数据源更改时,您的 List2 没有 selected 索引就不会出现问题。
3.
要么,
从索引更改处理程序中取出绑定声明,并在 List1 中的索引为 selected.So 时有条不紊地调用它们,当 List1 的 selection 发生更改时,换句话说,列表 2 已更新,您需要更新您的数据源。 编辑:这是您控制错误处理的使用的另一种方式,以避免在数据源更新时出现超出范围的异常。
所以可能将以下内容放入一个单独的方法中。
private void MyTextMethod(){
defBlock.Text = arrayDef[ListView1.SelectedIndex][ListView2.SelectedIndex];
}
private void ListView2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try{
MyTextMethod)();
}
catch(OutOfRangeException){
// do something.
}
}
在您的 selected 索引中更改了处理程序,并在处理程序中调用单独的方法。
4.
从 list1 的 selectedindex 更改处理程序中获取 list2 的绑定声明。
因此您可以使用一种方法来更新 list2 的绑定源并管理 selected 索引更改处理程序。虽然这是最没用的建议。
底线:您需要一些 try 和 catch 或 throw 语句来管理超出范围的异常,因为第二个列表的长度不同,字母 As 列表的索引可能是 selected 为 10,然后字母 X 可能只有长度为 1 的列表,并且总是存在 selectionchange 返回 -1 的 selection 的问题。
(实际上不需要清除list2,随着数据源的改变,它会自动清除(对不起,我没说清楚))
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..
}
}