2011-09-14 13 views
5

Tôi đã đi qua một số mã cũ của tôi và đi qua một lớp lai IValueConverter/MarkupExtension. Nó khiến tôi tự hỏi liệu IServiceProvider trong phương pháp ProvideValue có thực sự hữu ích hay không, và nó sẽ hữu ích như thế nào?MarkupExtension.ProvideValue - IserviceProvider có thực sự được sử dụng không?

Tôi thấy rằng IServiceProvider chỉ có một phương thức: GetService, phải được truyền sang loại dịch vụ thích hợp. Tôi cũng đã xem trang MarkupExtension.ProvideValue MSDN và nó liệt kê các loại dịch vụ khác nhau. Tôi đoán, tôi chỉ tự hỏi liệu có bất kỳ dịch vụ nào hữu ích hay tôi nên rời khỏi phương pháp của mình như vậy?

Phương pháp hiện tại:

public Object ProvideValue(IServiceProvider serviceProvider) 
{ 
    return new MyConverter(); 
} 

Về cơ bản, tôi nên làm như sau:

public Object ProvideValue(IServiceProvider serviceProvider) 
{ 
    var provider = serviceProvider as SomeType; 

    if (provider == null) return new MyConverter(); 

    //Do something with the provider here? 
} 

Trả lời

6

Nếu MarkupExtension bạn tác phẩm mà không neeeding bất kỳ sự tương tác với các IServiceProvider sau đó rõ ràng là không có gì để thu được từ việc tiếp cận nó . Tất cả MarkupExtension/ValueConverter combos tôi đã nhìn thấy và viết bản thân mình cũng rơi vào thể loại này.

Chuyển từ các vấn đề thực tế, nếu bạn chỉ tìm kiếm tài liệu đọc, có thêm thông tin về những dịch vụ mà nhà cung cấp có thể cung cấp và cách chúng hữu ích here.

11

Nhà cung cấp có thể hữu ích để nhận thông tin về đối tượng đích và thuộc tính mà nó đang được áp dụng cho ví dụ. Nếu bạn không cần phải biết những giá trị này thì bạn không cần phải sử dụng nó

Ví dụ

public override object ProvideValue(IServiceProvider provider) 
{ 
    IProvideValueTarget service = (IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget)); 
    DependencyObject targetObject = service.TargetObject as DependencyObject; 
    DependencyProperty targetProperty = service.TargetProperty as DependencyProperty; 

    // ... 
}