2011-12-07 52 views

Trả lời

7

Bạn có thể sử dụng the <x:Array> markup extension, nhưng cú pháp của nó khá dài dòng.

Một lựa chọn khác là tạo ra riêng TypeConverter của bạn mà có thể chuyển đổi từ danh sách bằng dấu phẩy để một mảng:

class ArrayTypeConverter : TypeConverter 
{ 
    public override object ConvertFrom(
     ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string list = value as string; 
     if (list != null) 
      return list.Split(','); 

     return base.ConvertFrom(context, culture, value); 
    } 

    public override bool CanConvertFrom(
     ITypeDescriptorContext context, Type sourceType) 
    { 
     if (sourceType == typeof(string)) 
      return true; 

     return base.CanConvertFrom(context, sourceType); 
    } 
} 

Nếu loại bạn được chuyển sang là kiểu của bạn, bạn có thể sau đó áp dụng the [TypeConverter] attribute loại đó. Nhưng vì bạn muốn chuyển đổi thành string[], bạn không thể làm điều đó. Vì vậy, bạn phải áp dụng thuộc tính cho tất cả các thuộc tính mà bạn muốn sử dụng chuyển đổi này:

[TypeConverter(typeof(ArrayTypeConverter))] 
public string[] PropName { get; set; } 
2

Ý tưởng là để xác định giá trị tùy chỉnh như Array trong nguồn lực của một điều khiển/cửa sổ và sau đó chỉ cần sử dụng Binding tới một tài nguyên tĩnh:

<!-- or Window.Resources --> 
<UserControl.Resources> 
    <x:Array x:Key="CustomValues" 
      Type="sys:String" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
     <sys:String>Val1</sys:String> 
     <sys:String>Val2</sys:String> 
    </x:Array> 
</UserControl.Resources> 

<!-- Then just bind --> 
<ns:SomeControl PropName="{Binding Source={StaticResource CustomValues}}" /> 
+1

Tại sao phải ràng buộc với 'StaticResource'? Tại sao lại là tài nguyên? – Snowbear

+2

+1, đây là cách để đi cho các giá trị được biết đến tại thời gian biên dịch. Bây giờ nếu anh ta cần các giá trị động (các giá trị thời gian chạy, bị ràng buộc, vv), anh ta sẽ cần một ValueConverter của tôi (Multi) trả về một mảng. –

+0

@Snowbear: đây là những gì tôi biết bây giờ, tôi sẽ đánh giá cao bất kỳ giải pháp nâng cao hơn, tại sao bạn đã xóa câu trả lời của bạn và không cung cấp một câu trả lời? Thực sự tôi không có ý tưởng nào khác về cách làm như vậy sẽ +1 nếu bạn thể hiện một cách khác, cảm ơn trước – sll

3
 <ns:SomeControl> 
     <SomeControl.PropName> 
      <x:Array Type="sys:String"> 
       <sys:String>Val1</sys:String> 
       <sys:String>Val2</sys:String> 
      </x:Array> 
     </SomeControl.PropName> 
    </ns:SomeControl> 
+0

+1.Tôi chỉ nhận ra rằng bạn đã đề xuất câu trả lời này theo cách nhận xét của sll trước khi tôi viết. – Heinzi

+0

+1, nội dung thú vị! – sll

2

sll's answer là rất tốt, nhưng bạn có thể tránh được những tài nguyên nếu bạn muốn và viết giá trị trực tiếp vào kiểm soát:

<ns:SomeControl> 
    <ns:SomeControl.PropName> 
     <x:Array Type="sys:String" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>Val1</sys:String> 
      <sys:String>Val2</sys:String> 
     </x:Array> 
    </ns:SomeControl.PropName> 
</ns:SomeControl> 

Ngoài ra, bạn có thể di chuyển các khai báo xmlns: vào phần tử đầu (Window, UserControl, v.v.), do đó bạn không làm lộn xộn thuộc tính điều khiển của mình với nó.

PS: Nếu bạn là người phát triển SomeControl, tôi muốn sử dụng svick's approach và cung cấp Trình chuyển đổi TypeConverter.

+0

Phím 'x: 'thừa khi không phải là tài nguyên. – svick

+0

@svick: Cảm ơn, đã khắc phục điều đó. – Heinzi

+0

+1, nội dung thú vị! Không bao giờ biết về cú pháp như vậy – sll

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