【发布时间】:2011-08-04 09:44:48
【问题描述】:
我想绑定一个 Silverlight 控件上的 ComboBox。听起来很简单,但我发现因为 ItemsSource 的数据异步来自 Web 服务,所以只有在数据返回后,我才需要使用后面的代码绑定 SelectedValue。
数据进入的集合实现了 INotifyCollectionChanged 和 INotifyPropertyChanged,所以它应该都可以工作,并且确实组合框正确加载,但没有预先选择值。
我认为正在发生的是 SelectedValue 在集合加载之前被绑定 - 当组合框为空时 - 所以没有选择任何内容,然后当数据进入时,组合框被填充,但它不是再次检查选定的值。
因此,如果我使用后面的代码来连接事件并在代码中创建绑定,那么虽然我有这个工作,但我想将这一切都移到 XAML 中,例如:
<ComboBox HorizontalAlignment="Stretch" Margin="5,3,9,127" Name="cboCategoryID" Grid.Row="4" Grid.Column="1"
ItemsSource="{StaticResource Categories}"
SelectedValue="{Binding CategoryID, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True}"
SelectedValuePath="CategoryID"
DisplayMemberPath="Caption"
VerticalAlignment="Center">
</ComboBox>
这会正确加载项目,但不会绑定所选值。如果我将以下代码放在代码隐藏中,一切正常:
public MainControl()
{
InitializeComponent();
CategoryCollection cats = new CategoryCollection();
cats.Dispatcher = this.Dispatcher;
cats.LoadComplete += new EventHandler(cats_LoadComplete);
cboCategoryID.ItemsSource = cats;
cats.LoadAll();
}
private void cats_LoadComplete(object sender, EventArgs e)
{
cboCategoryID.SetBinding(ComboBox.SelectedValueProperty, new System.Windows.Data.Binding("CategoryID"));
}
有没有办法做到这一点而不求助于背后的代码?
【问题讨论】:
标签: silverlight binding