Windows 8.1到10 XAML - 参数不正确的异常

时间:2015-12-17 21:22:38

标签: c# xaml windows-runtime windows-10

我有一个在Windows 8.1中运行良好的Windows 8.1应用程序,但是当在Windows 10计算机上运行时,遇到XAML异常,带有未处理的异常消息,"参数不正确。"

当我将调试器类型更改为混合(托管和本机)时,异常消息为"值不在预期范围内。"

原创XAML

<ListView x:Name="myListView"
      Grid.Row="3"
      Margin="10"
      HorizontalAlignment="Center"
      VerticalAlignment="Top"
      BorderBrush="Gray"
      BorderThickness="1"
      FontSize="{StaticResource FontSizeMedium}"
      ItemsSource="{Binding LookupList}">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Width="{Binding DataContext.ColumnWidth, ElementName=myListView}" Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
            <ListView Name="gridList"
                      Grid.Row="1"
                      VerticalAlignment="Top"
                      FontSize="{StaticResource FontSizeMedium}"
                      ItemsSource="{Binding ColumnValues}"
                      SelectedIndex="{Binding DataContext.SelectedIndex,
                                              Mode=TwoWay,
                                              ElementName=myListView}"
                      SelectionMode="Single">
            </ListView>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

如果我删除SelectedIndex绑定中的ElementName,列表视图会加载(但没有正确的功能)。

修改后的XAML(加载无例外,但没有正确的功能)

<ListView x:Name="myListView"
      Grid.Row="3"
      Margin="10"
      HorizontalAlignment="Center"
      VerticalAlignment="Top"
      BorderBrush="Gray"
      BorderThickness="1"
      FontSize="{StaticResource FontSizeMedium}"
      ItemsSource="{Binding LookupList}">
<ListView.ItemTemplate>
    <DataTemplate>
        <Grid Width="{Binding DataContext.ColumnWidth, ElementName=myListView}" Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
            <ListView Name="gridList"
                      Grid.Row="1"
                      VerticalAlignment="Top"
                      FontSize="{StaticResource FontSizeMedium}"
                      ItemsSource="{Binding ColumnValues}"
                      SelectedIndex="{Binding DataContext.SelectedIndex,
                                              Mode=TwoWay}"
                      SelectionMode="Single">
            </ListView>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

是否仍然支持以这种方式绑定ElementName,还是有其他调试步骤可以产生更多信息?

2 个答案:

答案 0 :(得分:1)

我很惊讶它甚至在Windows Phone 8.1中工作,因为绑定不正确。

此绑定表达式{Binding DataContext.SelectedIndex, Mode=TwoWay, ElementName=myListView}在这里基本上意味着找到名为myListView的控件,然后找到控件SelectedIndex的一个名为DataContext的属性(在大多数情况下) , ViewModel )。

但实际上SelectedIndex应该是 ListView控件的依赖属性

所以修复很简单 - 只需删除DataContext. -

即可
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay, ElementName=myListView}"

答案 1 :(得分:-1)

要访问itemtemplate的items容器,您必须使用RelativeSource来查找包含项目模板的祖先。

在你的例子中,它意味着定义这种绑定

SelectedIndex="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=SelectedIndex,Mode=TwoWay}"
相关问题