如果ComboBox绑定到ObservableCollection,它什么时候收到它的Items?

时间:2016-05-23 21:34:16

标签: wpf combobox selecteditem lazy-initialization

我正在尝试一种保存/加载机制,以便在业务应用程序中重用。我已经奠定了基于ObservableCollection<>读/写xml的基础,使用属性来描述我的类属性。那部分是有效的。我可以将ObservableCollection保存到XML,然后在下次运行程序时将XML重新加载到ObservableCollection

这是我的问题。我有一个ComboBox ItemsSource.DataContext = ObservableCollection<Flag>; 当我运行程序时,它接受绑定就好了,但ComboBox本身直到稍后才会填充。我想将SelectedItem设置为我从XML加载的ObservableCollection<Flag>中的第一个项目。但是没有任何事情发生,因为当程序执行它的启动方法时,Items.Count仍然是0。我猜测ComboBox在获得焦点之前不会填充自己。我该如何解决这个问题?我可以强制ComboBox填充自己吗?我试过了cb_ARDAR_ARFlag.Items.Refresh();

XAML:

<ComboBox Name="cb_ARDAR_ARFlag"
          ItemsSource="{Binding}"
          SelectionChanged="cb_ARDAR_ARFlag_SelectionChanged">
   <ComboBox.ItemTemplate>
      <DataTemplate>
          <TextBlock Text="{Binding Flag_Desc}"/>
      </DataTemplate>
   </ComboBox.ItemTemplate>
</ComboBox>

相关守则:

public MainWindow()
    {
        InitializeComponent();

        setDataBinding();

        loadSavedData();
    }

    private void setDataBinding()
    {
        //Returns ObservableCollection<Flag>
        cb_ARDAR_ARFlag.DataContext = Flag.getOCAvailableFlags(); 
    }
    private void loadSavedData()
    {
        //When it gets here the ItemCount is 0 so nothing happens.
        //Refresh didn't help
        cb_ARDAR_ARFlag.Items.Refresh();
        Flag f = Enforcement_Save.loadOCARFlag().First();
        cb_ARDAR_ARFlag.SelectedItem = f;
    }

此时我仍然不确定最后的代码是否会成功识别要选择的正确“标记”项目,或者我最终会使用Linq。顺便说一下,这引出了另一个问题。你能以某种方式LinqComboBox.Items吗?

1 个答案:

答案 0 :(得分:1)

我已经重新创建了您的问题,并且您的信息是正确的,loadSavedData方法中的项数为= 0。在构造函数完全执行之后,似乎没有填充组合框。

与此同时,我发现你可以使用ItemsSource属性在你想要它加载时加载组合框:

cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();