【发布时间】:2016-05-23 21:34:15
【问题描述】:
我正在尝试一种保存/加载机制,以便在业务应用程序中重复使用。我已经为使用属性来描述我的类属性来读/写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 吗?
【问题讨论】:
-
如果你使用 Bindings 和 viewmodel,所有这些东西都不会成为问题。
标签: wpf combobox selecteditem lazy-initialization