[英]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.