首页显示时,Combobox不会绑定初始值

时间:2014-01-15 11:43:50

标签: c# wpf combobox

情景

我有一个UserControl,其中包含一些控件,其中一个是ComboBoxUserControl包含Page

UserControl公开了一些依赖项属性,以允许访问Items的{​​{1}}和SelectedValue。这些定义如下:

ComboBox

这些绑定到public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register("SelectedValue", typeof(int?), typeof(CustomComboBox), new FrameworkPropertyMetadata((int?)null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public int? SelectedValue { get { return (int?)this.GetValue(SelectedValueProperty); } set { this.SetValue(SelectedValueProperty, value); } } public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(List<ComboItem>), typeof(CustomComboBox), new FrameworkPropertyMetadata((List<ComboItem>)new List<ComboItem>(), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public List<ComboItem> Items { get { return (List<ComboItem>)this.GetValue(ItemsProperty); } set { this.SetValue(ItemsProperty, value); } } 控件,如下所示:

ComboBox

<ComboBox ItemsSource="{Binding Path=Items, ElementName=ThisControl}" DisplayMemberPath="Text" SelectedValuePath="ID" SelectedValue="{Binding Path=SelectedValue, ElementName=ThisControl, UpdateSourceTrigger=PropertyChanged}" /> 的名称为UserControl

此外,在上文中,"ThisControl"是一个包含每个项目定义的类,即名为ComboItemID的两个属性。这里的想法是Text是存储在数据库中的密钥,ID是列表中显示的用户友好值。

创建包含Text的{​​{1}}(使用构造函数)时,将使用以下代码填充ComboBox项目列表:

Page

最后,UserControl通过XML绑定到类属性,如下所示:

MyComboBox.Items.Clear();
MyComboBox.Items.Add(new ComboItem() { ID = 1, Text = "One" });
MyComboBox.Items.Add(new ComboItem() { ID = 2, Text = "Two" });

其中属性SelectedValue的类型为<c:CustomComboBox x:Name="MyComboBox" SelectedValue="{Binding Path=MyClassInstance.ItemID}" /> 。请务必注意,在填充组合框项目后,将设置类实例。

问题

首次显示页面时,初始选择的值未正确设置 - 这是一个空项目选择。我可以确保ItemID属性已设置为有效值(即int)。

当从ItemID中选择一个项目时,绑定 成功设置了1属性,并在&#39;保存&时正确保存到数据库#39;功能

一个可能有助于识别问题的奇怪行为是,如果包含ComboBox的窗口关闭,然后重新打开。 ItemID 确实获得正确的初始值 - 这与首次尝试时设置的ComboBox无关,或者不是。

所以,问题是:为什么第一次显示页面时没有显示初始值?

1 个答案:

答案 0 :(得分:0)

好的,我正在进行一些重构以改进我填充ComboBox Items的方式,而我似乎偶然发现了解决方案......

问题似乎与填充列表项的以下代码有关:

MyComboBox.Items.Clear();
MyComboBox.Items.Add(new ComboItem() { ID = 1, Text = "One" });
MyComboBox.Items.Add(new ComboItem() { ID = 2, Text = "Two" });

解决方案是直接设置Items属性,而不是清除它并填充它:

MyComboBox.Items = GetMyList();

GetMyList()返回List<ComboItem>类型的位置。