Comment faire en sorte que toutes mes valeurs de dépendance de contrôle utilisateur se chargent avant qu'ils ne puissent accéder à leurs valeurs?

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

Question

Lorsque j'appelle ce contrôle personnalisé, je dois placer les valeurs d'attribut dans le bon ordre car la troisième propriété de dépendance ( ItemTypeIdCode ) accède aux valeurs des deux premières. ( KeyField, ValueField ) pour rechercher des données dans la base de données. Si elles viennent après le premier attribut, leurs valeurs sont vides.

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

Comment puis-je rendre l'ordre de mes attributs de contrôle utilisateur arbitraire? , c'est-à-dire qu'ils chargent tous leurs valeurs en premier avant que l'un d'eux ne s'enregistre comme modifié?

Voici le code de mon contrôle utilisateur:

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

    }
}
Était-ce utile?

La solution

Initialisez les éléments uniquement lorsque toutes les propriétés sont définies:

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

Autres conseils

De toute façon, vous pouvez effectuer le traitement de configuration dans l'événement Load à la place des accesseurs de propriété? Ensuite, toutes les propriétés nécessaires seront définies par le temps de chargement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top