Xamarin.ios Monotouch.对话框:支持字段排除

Xamarin.ios Monotouch.对话框:支持字段排除,xamarin.ios,monotouch.dialog,Xamarin.ios,Monotouch.dialog,使用令人惊奇的MonoTouch.Dialog工具集,我如何确保不显示支持字段。当我将[Entry]属性分配给get时;设置属性,我将获得以下渲染结果: [Caption("Weight")] [Entry(Placeholder = "Kilograms", KeyboardType = UIKeyboardType.PhonePad)] public string Weight { get; set; } 我必须创建实际的支持字段(不使用自动属性),然后向其添加[Skip]属性。米格尔会知

使用令人惊奇的MonoTouch.Dialog工具集,我如何确保不显示支持字段。当我将[Entry]属性分配给get时;设置属性,我将获得以下渲染结果:

[Caption("Weight")]
[Entry(Placeholder = "Kilograms", KeyboardType = UIKeyboardType.PhonePad)]
public string Weight { get; set; }

我必须创建实际的支持字段(不使用自动属性),然后向其添加[Skip]属性。米格尔会知道是否有更好的方法。

< P>我认为这是MonoTouch.Dialog的一个错误。我在项目中对BindingContext进行了重大更改,因此无法指出进行修复的确切位置,但这可能会有所帮助:

    private MemberInfo[] GetMembers(object dataContext)
    {
        return dataContext.GetType().GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).Where(m =>
        {
            var methodInfo = m as MethodBase;
            //Bug 662867: var skip = m.GetCustomAttribute<SkipAttribute>(true) != null;
            var skip = m.Name == "ToString";
            return (methodInfo == null || !methodInfo.IsConstructor && !methodInfo.IsSpecialName) && m.MemberType != MemberTypes.Field && !skip;
        }).ToArray();
    }
private MemberInfo[]GetMembers(对象数据上下文)
{
返回dataContext.GetType().GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance)。其中(m=>
{
var methodInfo=m作为MethodBase;
//Bug 662867:var skip=m.GetCustomAttribute(true)!=null;
var skip=m.Name==“ToString”;
return(methodInfo==null | | |!methodInfo.IsConstructor&&!methodInfo.IsSpecialName)&&m.MemberType!=MemberTypes.Field&&!skip;
}).ToArray();
}
正如你在上面的代码中所看到的,我正在做一个特定的检查!methodInfo.IsSpecialName是自动属性的获取和设置方法。可以使用此方法获取对象的成员


我的项目MonoTouch.MVVM使用我的MonoTouch.Dialog版本,它不使用字段,只使用属性。如果要在字段上使用属性,请删除&&m.MemberType!=上述代码中的MemberTypes.Field。

这是MonoTouch.Dialog中的一个错误。您最好的选择是不使用属性,而是直接使用字段或更改MonoTouch.Dialog的本地副本,以防止创建非公共元素(目前它使用公共和私有方法)

更改此行:

var members = o.GetType ().GetMembers (BindingFlags.DeclaredOnly | BindingFlags.Public |
                                       BindingFlags.NonPublic | BindingFlags.Instance);
与:


我不知道你到底想避免看哪个部分。您的问题不清楚我希望支持字段不显示我返回并检查原始MonoTouch.Dialog源。添加my GetMembers()方法并将Reflect.cs中的第202行替换为:var members=GetMembers(o);谢谢你,米盖尔。对于其他需要它的人,请参见Reflect.cs中的第202行
var members = o.GetType ().GetMembers (BindingFlags.DeclaredOnly | BindingFlags.Public |
                                       BindingFlags.Instance);