代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何使我的所有用户控件依赖值在控制访问其值之前加载?

  •  0
  • Edward Tanguay  · 技术社区  · 15 年前

    当我调用此自定义控件时,必须将属性值 正确的秩序 因为第三个依赖属性( iTimeType码 )访问前两个值( 关键字段,值字段 )要在数据库中查找数据,如果它们位于第一个属性之后,则它们的值为空。

    <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;
            }
    
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Thomas Levesque    15 年前

    初始化 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);
        }
    
        2
  •  0
  •   Don Kirkby    15 年前

    您可以在加载事件中而不是在属性访问器中执行设置处理吗?然后,所有需要的属性都将按加载时间设置。