2011-07-23 19 views

Trả lời

8

Bạn có thể tạo và phơi bày chuyển đổi của bạn thông qua một tùy chỉnh MarkupExtension mà sẽ cung cấp cho bạn khai báo inline bạn đang tìm kiếm:

public class BooleanToVisibilityConverterExtension : MarkupExtension, IValueConverter 
{ 
    private BooleanToVisibilityConverter converter; 

    public BooleanToVisibilityCoverterExtension() : base() 
    { 
    this.converter = new BooleanToVisibilityConverter(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
    return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return this.converter.Convert(value, targetType, parameter, culture); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return this.converter.ConvertBack(value, targetType, parameter, culture); 
    } 
} 

Bây giờ bạn có thể sử dụng inline MarkupExtension để tạo ra một công cụ chuyển đổi mới:

<Button Visibility="{Binding Converter={local:BooleanToVisibilityConverter} ...}" .. /> 
+0

và trong khi tôi không hiển thị nó trong ví dụ của tôi, bạn có thể muốn làm cho bộ chuyển đổi nội bộ tĩnh để mỗi phần mở rộng không tạo ra một thể hiện mới của bộ chuyển đổi nội bộ – sellmeadog

+0

Cool! Kết hợp với cú pháp thông số constructor 'ValueConverter ' và markup chung (để chuyển cho ví dụ đối số boolean NOT), nó sẽ là giải pháp rất hay. – Poma

2

Không, bạn phải xác định bộ chuyển đổi như một nguồn lực ở đâu đó (cửa sổ, usercontrol, vv) trước khi bạn có thể sử dụng nó trong một ràng buộc.

+0

Không đúng, bạn có thể lấy được trình chuyển đổi từ MarkupExtension và tránh định nghĩa dưới dạng tài nguyên. – sam

7

Không thể sử dụng cú pháp ràng buộc. Nhưng nó có thể sử dụng yếu tố cú pháp:

<Button.Visibility> 
    <Binding ElementName="checkBox" Path=IsChecked> 
     <Binding.Converter> 
      <BooleanToVisibilityConverter /> 
     </Binding.Converter> 
    </Binding> 
</Button.Visibility> 

nhưng tại sao bạn sẽ muốn làm điều này? Nó có nghĩa là mỗi cá thể ràng buộc sẽ tạo ra một trình biến đổi mới. Đó không phải là hiệu quả từ một điểm bộ nhớ của xem.

3

Bạn có thể làm điều gì đó như thế này. Điều này nên hoạt động.

Mã giả:

public static class ConverterHost 
{ 
    public static readonly MyCoolConverter converter = new MyCoolConverter(); 
} 

và trong XAML, somethign như thế này:

{Binding Converter={x:Static conv:ConverterHost.converter }} 

Hope this helps.

Trân trọng.

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