繁体   English   中英

第一次显示页面时,组合框未绑定初始值

[英]Combobox not binding initial value when page first shown

场景

我有一个UserControl ,其中包含几个控件,其中一个是ComboBox UserControl带有Page

UserControl公开了几个依赖项属性,以允许访问ComboBoxItemsSelectedValue 这些定义如下:

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是一个类,其中包含每个项目的定义,即两个名为IDText属性。 这里的想法是ID是存储在数据库中的密钥,而Text是显示在列表中的用户友好值。

创建包含UserControlPage (使用构造函数)后,将使用以下代码填充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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM