Windows 8.1 to 10 XAML - 参数不正确异常
Windows 8.1 to 10 XAML - the parameter is incorrect exception
我有一个 Windows 8.1 应用程序在 Windows 8.1 中运行良好,但是当 运行 在 Windows 10 机器上时,我遇到 XAML 异常,带有未处理的异常消息,"The parameter is incorrect."
当我将调试器类型更改为混合(托管和本机)时,异常消息是 "Value does not fall within the expected range."
原版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,或者是否有额外的调试步骤可以产生更多信息?
要访问您的项目模板的项目容器,您必须使用 RelativeSource 来查找包含您的项目模板的祖先。
在您的示例中,这意味着定义这种绑定
SelectedIndex="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=SelectedIndex,Mode=TwoWay}"
我很惊讶它甚至可以在 Windows Phone 8.1 中工作,因为绑定不正确。
这里的这个绑定表达式{Binding DataContext.SelectedIndex, Mode=TwoWay, ElementName=myListView}
的意思基本上就是去定位一个名为myListView
的控件,然后在该控件的DataContext
中找到一个名为SelectedIndex
的属性 (在大多数情况下,ViewModel)。
但实际上 SelectedIndex
应该是 ListView
控件的依赖项 属性。
所以修复很简单 - 只需删除 DataContext.
-
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay, ElementName=myListView}"
我有一个 Windows 8.1 应用程序在 Windows 8.1 中运行良好,但是当 运行 在 Windows 10 机器上时,我遇到 XAML 异常,带有未处理的异常消息,"The parameter is incorrect."
当我将调试器类型更改为混合(托管和本机)时,异常消息是 "Value does not fall within the expected range."
原版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,或者是否有额外的调试步骤可以产生更多信息?
要访问您的项目模板的项目容器,您必须使用 RelativeSource 来查找包含您的项目模板的祖先。
在您的示例中,这意味着定义这种绑定
SelectedIndex="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=SelectedIndex,Mode=TwoWay}"
我很惊讶它甚至可以在 Windows Phone 8.1 中工作,因为绑定不正确。
这里的这个绑定表达式{Binding DataContext.SelectedIndex, Mode=TwoWay, ElementName=myListView}
的意思基本上就是去定位一个名为myListView
的控件,然后在该控件的DataContext
中找到一个名为SelectedIndex
的属性 (在大多数情况下,ViewModel)。
但实际上 SelectedIndex
应该是 ListView
控件的依赖项 属性。
所以修复很简单 - 只需删除 DataContext.
-
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay, ElementName=myListView}"