2009-11-28 24 views
0

當我把這種自定義控件,我必須把屬性值在正確的順序因爲第三依賴屬性(ItemTypeIdCode)訪問前兩個(關鍵字段,ValueField)查找數據的值在數據庫中,如果它們在第一個屬性之後,那麼它們的值是空的。在他們控制訪問它們的值之前,如何加載所有用戶控件依賴項值?

<controls:DropDown x:Name="TheItemTypes" 
    KeyField="idCode" ValueField="title" 
    ItemTypeIdCode="itemTypes" 
    Width="150" HorizontalAlignment="Left" Margin="0 0 0 5"/> 

我怎樣才能讓我的用戶控制的順序任意屬性?也就是說,它們在它們中的任何一個註冊爲已更改之前都先裝載它們的值。

這裏是我的用戶控件的代碼:

using System.Windows; 
using System.Collections.Generic; 
using TestApp.DataLayer; 

namespace TestApp.Controls 
{ 
    public partial class DropDown : DependencyComboBox 
    { 
     #region DependencyProperty: ItemTypeIdCode 
     public string ItemTypeIdCode 
     { 
      get 
      { 
       if (GetValue(ItemTypeIdCodeProperty) != null) 
        return GetValue(ItemTypeIdCodeProperty).ToString(); 
       else 
        return ""; 
      } 
      set { SetValue(ItemTypeIdCodeProperty, value); } 
     } 

     public static readonly DependencyProperty ItemTypeIdCodeProperty = 
      DependencyProperty.Register("ItemTypeIdCode", typeof(string), typeof(DropDown), 
       new PropertyMetadata(string.Empty, OnItemTypeIdCodePropertyChanged)); 

     private static void OnItemTypeIdCodePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      DropDown dropDown = dependencyObject as DropDown; 
      dropDown.OnPropertyChanged("ItemTypeIdCode"); 
      dropDown.OnItemTypeIdCodePropertyChanged(e); 
     } 

     private void OnItemTypeIdCodePropertyChanged(DependencyPropertyChangedEventArgs e) 
     { 

      Items.Clear(); 
      foreach (var kvp in Datasource.GetInstance().GetKeyValues(ItemTypeIdCode + "(" + KeyField + "," + ValueField + "); all; orderby displayOrder")) 
      { 
       Items.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Value)); 
      } 
      this.SelectedIndex = 0; 

     } 
     #endregion 


     #region DependencyProperty: KeyField 
     public string KeyField 
     { 
      get 
      { 
       if (GetValue(KeyFieldProperty) != null) 
        return GetValue(KeyFieldProperty).ToString(); 
       else 
        return ""; 
      } 
      set { SetValue(KeyFieldProperty, value); } 
     } 

     public static readonly DependencyProperty KeyFieldProperty = 
      DependencyProperty.Register("KeyField", typeof(string), typeof(DropDown), 
       new PropertyMetadata(string.Empty, OnKeyFieldPropertyChanged)); 

     private static void OnKeyFieldPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      DropDown dropDown = dependencyObject as DropDown; 
      dropDown.OnPropertyChanged("KeyField"); 
      dropDown.OnKeyFieldPropertyChanged(e); 
     } 

     private void OnKeyFieldPropertyChanged(DependencyPropertyChangedEventArgs e) 
     { 

     } 
     #endregion 

     #region DependencyProperty: ValueField 
     public string ValueField 
     { 
      get 
      { 
       if (GetValue(ValueFieldProperty) != null) 
        return GetValue(ValueFieldProperty).ToString(); 
       else 
        return ""; 
      } 
      set { SetValue(ValueFieldProperty, value); } 
     } 

     public static readonly DependencyProperty ValueFieldProperty = 
      DependencyProperty.Register("ValueField", typeof(string), typeof(DropDown), 
       new PropertyMetadata(string.Empty, OnValueFieldPropertyChanged)); 

     private static void OnValueFieldPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      DropDown dropDown = dependencyObject as DropDown; 
      dropDown.OnPropertyChanged("ValueField"); 
      dropDown.OnValueFieldPropertyChanged(e); 
     } 

     private void OnValueFieldPropertyChanged(DependencyPropertyChangedEventArgs e) 
     { 

     } 
     #endregion 

     public DropDown() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

    } 
} 

回答

1

初始化Items,只有當所有屬性都設置:

private void InitItems() 
    { 
     if (!string.IsNullOrEmpty(ItemTypeIdCode) && 
      !string.IsNullOrEmpty(KeyField) && 
      !string.IsNullOrEmpty(ValueField)) 
     { 

      Items.Clear(); 
      foreach (var kvp in Datasource.GetInstance().GetKeyValues(ItemTypeIdCode + "(" + KeyField + "," + ValueField + "); all; orderby displayOrder")) 
      { 
       Items.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Value)); 
      } 
      this.SelectedIndex = 0; 
     } 
    } 

    private void OnItemTypeIdCodePropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     InitItems(); 
    } 

    private static void OnKeyFieldPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     DropDown dropDown = dependencyObject as DropDown; 
     dropDown.InitItems(); 
     dropDown.OnPropertyChanged("KeyField"); 
     dropDown.OnKeyFieldPropertyChanged(e); 
    } 

    private static void OnValueFieldPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     DropDown dropDown = dependencyObject as DropDown; 
     dropDown.InitItems(); 
     dropDown.OnPropertyChanged("ValueField"); 
     dropDown.OnValueFieldPropertyChanged(e); 
    } 
0

什麼辦法可以在Load事件而不是屬性訪問器做調整處理?然後所有需要的屬性將由加載時間設置。

+0

對不起,我剛纔注意到你問WPF。我不知道它是否有同樣的事件。 – 2009-11-28 01:49:18

相關問題