情景
我有一个UserControl
,其中包含一些控件,其中一个是ComboBox
。 UserControl
包含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"
是一个包含每个项目定义的类,即名为ComboItem
和ID
的两个属性。这里的想法是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无关,或者不是。
所以,问题是:为什么第一次显示页面时没有显示初始值?
答案 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>
类型的位置。