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

When does a ComboBox receive its Items if it is bound to ObservableCollection?

我正在尝试使用 save/load 机制在业务应用程序中重用。我已经为 read/write ObservableCollection<> to/from xml 奠定了基础,使用属性来描述我的 class 属性。那部分正在工作。我可以将 ObservableCollection 保存到 XML,然后在下次 运行 程序时将 XML 加载回 ObservableCollection

这是我的问题。我有一个 ComboBoxItemsSource.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;
    }

此时我仍然不确定最后的代码是否会成功识别要选择的正确 'flag' 项目,或者我是否最终会使用 Linq。顺便说一下,这让我想到了另一个问题。你能 LinqComboBox.Items 吗?

我已经重现了您的问题,您是正确的,在 loadSavedData 方法中项目计数 = 0。在构造函数完全执行之前,组合框似乎不会被填充。

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

cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();