¿Cómo puede cargar todos mis valores de dependencia de control de usuario antes de que controlen el acceso a sus valores?

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

Pregunta

Cuando llamo a este control personalizado, tengo que poner los valores de los atributos en el orden correcto ya que la tercera propiedad de dependencia ( ItemTypeIdCode ) accede a los valores de los dos primeros ( KeyField, ValueField ) para buscar datos en la base de datos, y si vienen después del primer atributo, entonces sus valores están vacíos.

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

¿Cómo puedo hacer que el orden de mis atributos de control de usuario sea arbitrario? es decir, para que todos carguen sus valores primero antes de que alguno de ellos se registre como modificado.

Aquí está el código para mi control de usuario:

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

    }
}
¿Fue útil?

Solución

Inicialice Elementos solo cuando todas las propiedades estén configuradas:

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

Otros consejos

¿Puede hacer el proceso de configuración en el evento Load en lugar de los accesos de propiedad? Luego, todas las propiedades necesarias se establecerán por tiempo de carga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top