如果 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
。
这是我的问题。我有一个 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;
}
此时我仍然不确定最后的代码是否会成功识别要选择的正确 'flag' 项目,或者我是否最终会使用 Linq。顺便说一下,这让我想到了另一个问题。你能 Linq
到 ComboBox.Items
吗?
我已经重现了您的问题,您是正确的,在 loadSavedData 方法中项目计数 = 0。在构造函数完全执行之前,组合框似乎不会被填充。
同时我发现您可以使用 ItemsSource 属性 在您想要加载组合框时加载它:
cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();
我正在尝试使用 save/load 机制在业务应用程序中重用。我已经为 read/write ObservableCollection<>
to/from xml
奠定了基础,使用属性来描述我的 class 属性。那部分正在工作。我可以将 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;
}
此时我仍然不确定最后的代码是否会成功识别要选择的正确 'flag' 项目,或者我是否最终会使用 Linq。顺便说一下,这让我想到了另一个问题。你能 Linq
到 ComboBox.Items
吗?
我已经重现了您的问题,您是正确的,在 loadSavedData 方法中项目计数 = 0。在构造函数完全执行之前,组合框似乎不会被填充。
同时我发现您可以使用 ItemsSource 属性 在您想要加载组合框时加载它:
cb_ARDAR_ARFlag.ItemsSource = Flag.getOCAvailableFlags();