2017-04-24 153 views
2

我想了解绑定和XAML。我有一个非常简单的例子,我将一个字符串数组绑定到在XAML中定义的组合框。我也想设置选定的索引。为什么我在设置ComboBox.SelectedIndex时出现异常?

我得到一个异常:

值不在预期的范围内。

SelectedIndex property。

这里是我的UAM应用程序的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. 如果我把SelectedIndexPage_Loaded事件处理程序,它工作正常。
  3. 在经典的桌面XAML(又名WPF)中,不会有任何问题。

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

回答

2

因为你的ItemsSource仍然当您尝试设置BrowserCombo.SelectedIndex = 1;在页面的构造你得到这个异常。您正在使用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; 
} 

你会看到x:Bind加载事件得到解决 - 这解释了为什么在构造函数您还有null in ItemsSource

的另一件事是,与老绑定 - 当你设置DataContext = this;它是解决了,但使用的是x:Bind而事实上你并不需要设置的DataContext - 它不会改变任何东西。如果您用ItemsSource="{Binding ComboStrings}"替换ItemsSource="{x:Bind ComboStrings}",那么您的代码应该可以工作,否则您可能会删除DataContext = this;这一行。

另一个有趣的事情是,在XAML中定义绑定的顺序,也可引起类似的麻烦 - 例如,如果你定义组合框这样的:

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

,那么你也将获得异常 - SelectedIndex在集合建立之前正在解析。当它正常工作时,与其相反:

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