【问题标题】:Why I get exception when setting ComboBox.SelectedIndex?为什么设置 ComboBox.SelectedIndex 时出现异常?
【发布时间】:2017-09-21 12:53:18
【问题描述】:

我正在尝试了解绑定和 XAML。我有一个非常简单的示例,我将字符串数组绑定到 XAML 中定义的组合框。我也想设置选中的索引。

我遇到了一个异常:

值不在预期范围内。

使用 SelectedIndex 属性。

这是我用于 UWP 应用程序的 XAML。

<StackPanel Background="{ThemeResource applicationPageBackgroundThemeBrush}">
    <ComboBox Name="BrowserCombo" ItemsSource="{x:Bind ComboStrings}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding}"/>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</StackPanel>

以及背后的代码

public sealed partial class MainPage : Page
{
    private string[] comboStrings = { "One", "Two", "Three" };
    public List<String> ComboStrings
    {
       get { return new List<string>(comboStrings); }
    }

    public MainPage()
    {
        this.InitializeComponent();
        DataContext = this;
        BrowserCombo.SelectedIndex = 1;
    }

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        // BrowserCombo.SelectedIndex = 1;
    }
}

我希望它非常简单,所以没有 MVVM - 我仍然需要学习这个概念。

备注:

  1. 我可以将 SelectedIndex 放在 XAML 文件中。同样的问题。
  2. 如果我将 SelectedIndex 放在 Page_Loaded 事件处理程序中,它可以正常工作。
  3. 在经典桌面 XAML(又名 WPF)中不会出现问题。

似乎 XAML-WinRt 和 XAML-WPF 之间的项目列表填充方式不同。访问 SelectedIndex 属性的最早点是什么?

【问题讨论】:

    标签: xaml data-binding uwp winrt-xaml


    【解决方案1】:

    您会收到此异常,因为当您尝试在页面的构造函数中设置 BrowserCombo.SelectedIndex = 1; 时,您的 ItemsSource 仍然是 null。您正在使用x:Bind - 如果您调试生成的 MainPage.g.cs 文件并在那里放置一些断点:

    public void Loading(global::Windows.UI.Xaml.FrameworkElement src, object data)
    {
        this.Initialize();
    }
    
    public void Initialize()
    {
        if (!this.initialized)
        {
            this.Update();
        }
    }
    
    public void Update()
    {
        this.Update_(this.dataRoot, NOT_PHASED);
        this.initialized = true;
    }
    

    您将在 Loading 事件中看到 x:Bind 正在解析 - 这解释了为什么在构造函数中 ItemsSource 中仍有 null

    另一件事是旧的Binding - 当你设置DataContext = this;时它被解决了,但是你使用x:Bind实际上你不需要设置 DataContext - 这里没有任何改变。如果您将ItemsSource="{x:Bind ComboStrings}" 替换为ItemsSource="{Binding ComboStrings}",那么您的代码应该可以工作,否则您可以删除DataContext = this; 行。

    另一个有趣的事情是,XAML 中定义绑定的顺序也会导致类似的问题——例如,如果您像这样定义 ComboBox

    <ComboBox Name="BrowserCombo" SelectedIndex="{x:Bind Index}" ItemsSource="{x:Bind ComboStrings}">
    

    那么你也会得到异常 - SelectedIndex 在集合设置之前被解析。与正常工作时的情况相反:

    <ComboBox Name="BrowserCombo" ItemsSource="{x:Bind ComboStrings}" SelectedIndex="{x:Bind Index}">
    

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多