2011-01-26 68 views
2

使用驚人的MonoTouch.Dialog工具集,我如何確保不顯示支持字段。當我將一個[Entry]屬性賦值給get; set;財產,我得到以下渲染:Monotouch.Dialog:支持字段排除

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

enter image description here

+0

我不知道到底要避免被顯示哪些部分。從您的問題 – 2011-01-26 16:44:37

+0

不清楚我希望後臺字段不顯示 – 2011-01-27 02:22:46

回答

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); 
0

我不得不創建實際的支持字段(不使用自動屬性),然後將[跳過]屬性添加到他們。米格爾會知道是否有更好的方法。

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不使用字段和唯一的屬性。如果要使用字段上的屬性,請在上面的代碼中刪除m.MemberType!= MemberTypes.Field中的& &。

+0

我回去檢查原始的MonoTouch.Dialog源。添加我的GetMembers()方法並將Reflect.cs中的第202行替換爲: var members = GetMembers(o); – 2011-01-26 19:53:44