كيف يمكن تحميل جميع قيم تبعية التحكم في المستخدم قبل أن يتحكموا في الوصول إلى قيمهم؟

StackOverflow https://stackoverflow.com/questions/1811265

سؤال

عندما أقوم باستدعاء عنصر التحكم المخصص هذا، لا بد لي من وضع قيم السمات في ملف طلب صحيح منذ خاصية التبعية الثالثة (ItemTypeIdCode) يصل إلى قيم الأولين (الحقل الرئيسي، حقل القيمة) للبحث عن البيانات في قاعدة البيانات، وإذا جاءت بعد السمة الأولى، فإن قيمها فارغة.

<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;
        }

    }
}
هل كانت مفيدة؟

المحلول

تهيئة 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);
    }

نصائح أخرى

هل هناك أي طريقة يمكنك من خلالها إجراء معالجة الإعداد في حدث التحميل بدلاً من أدوات الوصول إلى الخاصية؟ثم سيتم تعيين كافة الخصائص المطلوبة حسب وقت التحميل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top