簡體   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