C# 如何使我的所有用户控件依赖项值在控件访问其值之前加载?
调用此自定义控件时,我必须将属性值按正确顺序排列,因为第三个依赖属性(ItemTypeIdCode)访问前两个(KeyField,ValueField)的值以查找数据库中的数据,如果它们位于第一个属性之后,那么它们的值是空的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
<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”);