我正在尝试一种保存/加载机制,以便在业务应用程序中重用。我已经奠定了基于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。顺便说一下,这引出了另一个问题。你能以某种方式Linq
到ComboBox.Items
吗?
答案 0 :(得分:1)
我已经重新创建了您的问题,并且您的信息是正确的,loadSavedData方法中的项数为= 0。在构造函数完全执行之后,似乎没有填充组合框。
与此同时,我发现你可以使用ItemsSource属性在你想要它加载时加载组合框:
cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();