2016-05-23 11 views
0

Я пытаюсь использовать механизм сохранения/загрузки для повторного использования в бизнес-приложении. У меня есть основа для чтения/записи ObservableCollection<> в/из xml, используя атрибуты для описания свойств моего класса. Эта часть работает. Я могу сэкономить ObservableCollection до XML, а затем загрузить XML обратно в ObservableCollection при следующем запуске программы.Когда ComboBox получает свои Элементы, если он привязан к ObservableCollection?

Вот моя проблема. У меня есть ComboBox, у которого ItemsSource.DataContext = ObservableCollection<Flag>; Когда я запускаю программу, он принимает привязку только штрафом, но сам ComboBox не заполняет себя до конца. Я хочу установить SelectedItem как первый элемент в ObservableCollection<Flag>, который я загрузил из XML. Ничего не происходит, потому что, поскольку программа выполняет свои методы запуска, 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. Что, кстати, приводит меня к другому вопросу. Можете вы Linq до ComboBox.Items как-нибудь?

+0

Все такого рода вещи становится не проблема, если вы используете Наручники и viewmodel. –

ответ

1

Я воссоздал вашу проблему, и ваши данные верны, количество элементов = 0 в методе loadSavedData. Компоновка, похоже, не заполняется до тех пор, пока конструктор не выполнит полностью.

В то же время я обнаружил, вы можете использовать свойство ItemsSource для загрузки выпадающий в то время вы хотите нагрузить:

cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();

+0

Это работает отлично для моей цели. Для этой цели не требуется привязка через DataContext. –