[英]Combobox not binding initial value when page first shown
场景
我有一个UserControl
,其中包含几个控件,其中一个是ComboBox
。 UserControl
带有Page
。
UserControl
公开了几个依赖项属性,以允许访问ComboBox
的Items
和SelectedValue
。 这些定义如下:
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
是显示在列表中的用户友好值。
创建包含UserControl
的Page
(使用构造函数)后,将使用以下代码填充ComboBox项列表:
MyComboBox.Items.Clear();
MyComboBox.Items.Add(new ComboItem() { ID = 1, Text = "One" });
MyComboBox.Items.Add(new ComboItem() { ID = 2, Text = "Two" });
最后, SelectedValue
通过XML绑定到类属性,如下所示:
<c:CustomComboBox x:Name="MyComboBox" SelectedValue="{Binding Path=MyClassInstance.ItemID}" />
其中属性ItemID
的类型为int
。 重要的是要注意,在填充组合框项目之后设置了类实例。
问题
首次显示该页面时,初始选择的值设置不正确-这是一个空项目选择。 我可以确保ItemID
属性已经设置为有效值(即1
)。
当从ComboBox
选择一个项目时,绑定确实会成功设置ItemID
属性,并通过“保存”功能正确地保留在数据库中。
一种可能有助于识别问题的奇怪行为是,如果包含Page
的窗口被关闭,然后重新打开。 ComboBox
确实获得了正确的初始值-这与在初次尝试时是否设置ComboBox或其他方式无关。
因此,问题是:为什么初次显示页面时不显示初始值?
好的,我正在做一些重构以改善填充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>
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.