2011-01-12 40 views
10

Tôi biết tôi có thể làm điều này bằng cách viết mô tả kiểu tùy chỉnh, v.v. Tuy nhiên, với yêu cầu này đơn giản như thế nào; Tôi đang thiếu một cách dễ dàng để làm điều đó.Làm cách nào để hiển thị thuộc tính bool là Có | Không có trong lưới thuộc tính?

Có thể đặt chuỗi cho "true" và "false" trong BooleanConverter có thể là tất cả những gì tôi cần, nhưng BooleanConverter đứng dường như không cho phép bạn đặt chuỗi tùy chỉnh.

Trả lời

9

Bạn sẽ phải tùy chỉnh nó. Như thế này:

class YesNoConverter : BooleanConverter { 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { 
     if (value is bool && destinationType == typeof(string)) { 
      return values[(bool)value ? 1 : 0]; 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { 
     string txt = value as string; 
     if (values[0] == txt) return false; 
     if (values[1] == txt) return true; 
     return base.ConvertFrom(context, culture, value); 
    } 

    private string[] values = new string[] { "No", "Yes" }; 
} 

mẫu sử dụng:

class MyControl : Control { 
    [TypeConverter(typeof(YesNoConverter))] 
    public bool Prop { get; set; } 
} 

Bạn không nhận được sự giúp đỡ từ System.Globalization để làm công việc này bằng các ngôn ngữ khác.

+0

Cảm ơn, đóng, nhưng khi tôi nhấp đúp vào giá trị, tôi nhận được lỗi Dlg "Giá trị thuộc tính không hợp lệ"/"Đối tượng thuộc loại 'System.String' không thể chuyển đổi thành loại 'System.Boolean'." –

+0

Ugh, pita. Đặt một PropertyGrid trên một biểu mẫu để gỡ lỗi này khi chạy. –

+1

Bạn có thể cần Hệ thống :: Chuyển đổi :: ToBoolean (giá trị) thay vì truyền sang bool. – ThePragmatist

3

Bạn có thể tránh thực hiện một chuyển đổi tùy chỉnh bằng cách sử dụng một enum:

public enum YesNo{No,Yes} 

... 

[Browsable(true)] 
public YesNo IsValueSet {get;set) 

[Browsable(false)] //also consider excluding it from designer serialization 
public bool ValueSetAsBool 
{ 
    get { return Convert.ToBoolean((byte)IsValueSet); } 
    set { IsValueSet = value ? YesNo.Yes : YesNo.No; } 
} 

Như là, giải pháp này không phải là bản địa hóa, và bạn sẽ phải thực hiện một enum cho mỗi hoán vị của "On/Off "cặp giá trị bạn muốn sử dụng. Nhưng, đó là câu trả lời đơn giản cho một lần duy nhất.

Các vấn đề liên quan