2009-11-28 23 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

相关问题