我认为我的愚蠢问题有一个简单的解决方案,但我今天无法解决。
我有一个用户控件,其本身具有angular.module('XYZ')
.config(function($routeProvider) {
console.log("Configuring routes");
$routeProvider.when('/login', {
templateUrl: "./templates/login.html",
controller: "LoginController",
controllerAs: "loginCtrl"
})
});
控件。我还公开了一些属性供用户修改。
其中一个属性是MaskedTextBox
属性,我想公开它,能够使用预定义的值启动编辑器,就像在普通的MaskedTextBox控件中一样。
所以我创建了一个公共属性InputMask并设置了所有内容以便它可以工作但是在显示编辑器之后,我得到一个包含此错误的错误对话框:
对象引用未设置为对象的实例
如果我不使用编辑器并复制掩码或通过代码设置它没有问题。
以下是代码示例:
Mask
答案 0 :(得分:2)
在正常情况下,注册ui类型编辑器就足够了,你不需要做任何额外的事情。但在MaskPropertyEditor
案例中,编辑属性时,编辑器会希望该属性属于MaskedTextBox
并将ITypeDescriptorContext.Instance
转换为MaskedTextBox
,因为我们正在编辑Mask
属性属于我们的UserControl
,它不是一个蒙版文本框,会抛出一个空引用异常。
要解决此问题,您需要创建自定义UITypeEditor
并覆盖EditValue
并修改私有Mask
字段的MaskedTextBox
属性。为此,我们需要创建一个包含ITypeDescriptorContext
的{{1}}实例,并将其传递给编辑器的MaskedTextBox
方法。
以下是实施。
<强>用户控件强>
EditValue
<强>编辑强>
public partial class UserControl1 : UserControl
{
MaskedTextBox maskedTextBox;
public UserControl1()
{
InitializeComponent();
maskedTextBox = new MaskedTextBox();
}
[Editor(typeof(MaskEditor), typeof(UITypeEditor))]
public string Mask
{
get { return maskedTextBox.Mask; }
set { maskedTextBox.Mask = value; }
}
}
ITypeDescriptionContext实施
public class MaskEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
var field = context.Instance.GetType().GetField("maskedTextBox",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
var maskedTextBox = (MaskedTextBox)field.GetValue(context.Instance);
var maskProperty = TypeDescriptor.GetProperties(maskedTextBox)["Mask"];
var tdc = new TypeDescriptionContext(maskedTextBox, maskProperty);
var editor = (UITypeEditor)maskProperty.GetEditor(typeof(UITypeEditor));
return editor.EditValue(tdc, provider, value);
}
}