代码之家  ›  专栏  ›  技术社区  ›  Rockin Raul

如果ComboBox绑定到ObservableCollection,它何时接收其Items?

  •  0
  • Rockin Raul  · 技术社区  · 8 年前

    我正在尝试在业务应用程序中重复使用保存/加载机制。我有读/写的基础 ObservableCollection<> 至/自 xml ,使用属性描述类属性。这部分正在工作。我可以救一个 ObservableCollection XML ,然后加载 XML格式 回到一个 ObservableCollection(可观察集合) 下次运行程序时。

    这是我的问题。我有一个 ComboBox 谁的 ItemsSource.DataContext = ObservableCollection<Flag>; 当我运行程序时,它接受绑定,但 组合框 自身直到稍后才会填充自身。我想将SelectedItem设置为 ObservableCollection<Flag> 我从XML加载的。但是什么也没有发生,因为当程序执行它的启动方法时 Items.Count 残余 0 .我猜 组合框 在获得焦点之前不会填充自身。我该如何解决这个问题?我可以强制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。顺便说一下,这又引出了另一个问题。你能 Linq ComboBox.Items 以某种方式

    1 回复  |  直到 8 年前
        1
  •  1
  •   dev1998    8 年前

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

    与此同时,我发现您可以使用ItemsSource属性在希望加载组合框时加载它:

    cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();