Monotouch.Dialog:支持字段排除

时间:2011-01-26 12:55:23

标签: xamarin.ios monotouch.dialog

使用神奇的MonoTouch.Dialog工具集,如何确保不显示Backing字段。当我将[Entry]属性分配给get; set;属性,我得到以下渲染:

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

enter image description here

3 个答案:

答案 0 :(得分:3)

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

更改此行:

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

使用:

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

答案 1 :(得分:2)

我认为这是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();
    }

正如您在上面的代码中看到的,我正在对!methodInfo.IsSpecialName进行特定检查,它是自动属性的Get和Set方法。您可以使用此方法获取对象的成员。

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

答案 2 :(得分:0)

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