Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使我的所有用户控件依赖项值在控件访问其值之前加载?_C#_Wpf_Xaml_Dependency Properties - Fatal编程技术网

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

C# 如何使我的所有用户控件依赖项值在控件访问其值之前加载?,c#,wpf,xaml,dependency-properties,C#,Wpf,Xaml,Dependency Properties,调用此自定义控件时,我必须将属性值按正确顺序排列,因为第三个依赖属性(ItemTypeIdCode)访问前两个(KeyField,ValueField)的值以查找数据库中的数据,如果它们位于第一个属性之后,那么它们的值是空的 <controls:DropDown x:Name="TheItemTypes" KeyField="idCode" ValueField="title" ItemTypeIdCode="itemTypes" Width="150" Horizont

调用此自定义控件时,我必须将属性值按正确顺序排列,因为第三个依赖属性(ItemTypeIdCode)访问前两个(KeyField,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;
        }

    }
}
使用System.Windows;
使用System.Collections.Generic;
使用TestApp.DataLayer;
命名空间TestApp.Controls
{
公共部分类下拉列表:DependencyComboBox
{
#区域相关属性:ItemTypeIdCode
公共字符串ItemTypeIdCode
{
得到
{
if(GetValue(ItemTypeIdCodeProperty)!=null)
返回GetValue(ItemTypeIdCodeProperty).ToString();
其他的
返回“”;
}
set{SetValue(ItemTypeIdCodeProperty,value);}
}
公共静态只读DependencyProperty ItemTypeIdCodeProperty=
DependencyProperty.Register(“ItemTypeIdCode”、typeof(字符串)、typeof(下拉列表),
新的PropertyMetadata(string.Empty,OnItemTypeIdCodePropertyChanged));
私有静态无效OnItemTypeIdCodePropertyChanged(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
DropDown DropDown=作为下拉菜单的dependencyObject;
OnPropertyChanged(“ItemTypeIdCode”);
下拉列表。OnItemTypeIdCodePropertyChanged(e);
}
私有无效OnItemTypeIdCodePropertyChanged(DependencyPropertyChangedEventArgs e)
{
Items.Clear();
foreach(Datasource.GetInstance().GetKeyValues中的var kvp(ItemTypeIdCode+”(“+KeyField+”,“+ValueField+”);全部;orderby displayOrder”))
{
添加(新的KeyValuePair(kvp.Key,kvp.Value));
}
此参数。SelectedIndex=0;
}
#端区
#区域相关属性:KeyField
公共字符串键域
{
得到
{
如果(GetValue(KeyFieldProperty)!=null)
返回GetValue(KeyFieldProperty).ToString();
其他的
返回“”;
}
set{SetValue(KeyFieldProperty,value);}
}
公共静态只读DependencyProperty KeyFieldProperty=
DependencyProperty.Register(“键域”、typeof(字符串)、typeof(下拉列表),
新的PropertyMetadata(string.Empty,OnKeyFieldPropertyChanged));
私有静态无效OnKeyFieldPropertyChanged(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
DropDown DropDown=作为下拉菜单的dependencyObject;
下拉列表.OnPropertyChanged(“关键字段”);
下拉列表。OnKeyFieldPropertyChanged(e);
}
私有void OnKeyFieldPropertyChanged(DependencyPropertyChangedEventArgs e)
{
}
#端区
#区域相关属性:ValueField
公共字符串值字段
{
得到
{
如果(GetValue(ValueFieldProperty)!=null)
返回GetValue(ValueFieldProperty).ToString();
其他的
返回“”;
}
set{SetValue(ValueFieldProperty,value);}
}
公共静态只读从属属性ValueFieldProperty=
DependencyProperty.Register(“ValueField”、typeof(字符串)、typeof(下拉列表),
新的PropertyMetadata(string.Empty,OnValueFieldPropertyChanged));
私有静态void OnValueFieldPropertyChanged(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
DropDown DropDown=作为下拉菜单的dependencyObject;
下拉列表。OnPropertyChanged(“ValueField”);
下拉列表。OnValueFieldPropertyChanged(e);
}
私有无效OnValueFieldPropertyChanged(DependencyPropertyChangedEventArgs e)
{
}
#端区
公共下拉列表()
{
初始化组件();
DataContext=this;
}
}
}

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

仅当设置了所有属性时才初始化

    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);
    }
private void InitItems()
{
如果(!string.IsNullOrEmpty(ItemTypeIdCode)&&
!string.IsNullOrEmpty(键域)&&
!string.IsNullOrEmpty(ValueField))
{
Items.Clear();
foreach(Datasource.GetInstance().GetKeyValues中的var kvp(ItemTypeIdCode+”(“+KeyField+”,“+ValueField+”);全部;orderby displayOrder”))
{
添加(新的KeyValuePair(kvp.Key,kvp.Value));
}
此参数。SelectedIndex=0;
}
}
私有无效OnItemTypeIdCodePropertyChanged(DependencyPropertyChangedEventArgs e)
{
InitItems();
}
私有静态无效OnKeyFieldPropertyChanged(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
DropDown DropDown=作为下拉菜单的dependencyObject;
dropDown.InitItems();
下拉列表.OnPropertyChanged(“关键字段”);
下拉列表。OnKeyFieldPropertyChanged(e);
}
私有静态void OnValueFieldPropertyChanged(DependencyObject DependencyObject,DependencyPropertyChangedEventArgs e)
{
DropDown DropDown=作为下拉菜单的dependencyObject;
dropDown.InitItems();
下拉列表。OnPropertyChanged(“ValueField”);