2011-12-29 20 views
6

Tôi có một UserControl mà tôi đã tạo để nhập một vài phần bằng cách sử dụng thuộc tính [Import].Sử dụng MEF trong các điều khiển được tạo từ XAML

public class MyUserControl : UserControl, IPartImportsSatisfiedNotification 
{ 
    [Import] 
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
    } 

    public void OnImportsSatisfied() 
    { 
     // Do something with Service. 
    } 
} 

UserControl này được khởi tạo từ XAML, vì vậy, nhập khẩu của nó không được đáp ứng và OnImportsSatisfied không được gọi.

<local:MyUserControl /> 

Câu hỏi của tôi là làm cách nào để tôi có thể đáp ứng các lần nhập của lớp khi được tạo trong XAML.

+0

Điều đó có thể khó thực hiện vì WPF thường dỡ các điều khiển không hiển thị, do đó, điều khiển này chỉ có thể tồn tại một lần, nhưng có thể tải và tải nhiều lần. – Rachel

+0

@Rachel để ngăn chặn điều đó, anh ta có thể sử dụng tải chậm. –

+0

Bạn có chắc chắn điều này là đúng đắn không? Điều này có vẻ như bạn đang cố gắng đưa logic nghiệp vụ vào kiểm soát giao diện người dùng. Mà luôn luôn là điều xấu. – Euphoric

Trả lời

2

Từ MSDN:

Để được khởi tạo như một yếu tố đối tượng trong XAML, một lớp tùy chỉnh phải đáp ứng các yêu cầu sau:
Các lớp tùy chỉnh phải được công khai và phải tiếp xúc với một mặc định (parameterless) công cộng constructor. (Xem phần sau để biết các ghi chú về cấu trúc.)
Lớp tùy chỉnh không được là lớp lồng nhau. Dấu "chấm" phụ trong đường dẫn đầy đủ tên giúp phân chia không gian tên lớp không rõ ràng và cản trở các tính năng XAML khác, chẳng hạn như thuộc tính đính kèm.
Nếu một đối tượng có thể được khởi tạo thành phần tử đối tượng, đối tượng được tạo có thể điền vào biểu mẫu thuộc tính của bất kỳ thuộc tính nào lấy đối tượng làm loại cơ bản của chúng.
Bạn vẫn có thể cung cấp giá trị đối tượng cho các loại không đáp ứng các tiêu chí này, nếu bạn bật giá trị trình chuyển đổi. Để biết thêm thông tin, hãy xem Loại Trình chuyển đổi và Đánh dấu Tiện ích mở rộng cho XAML.

Từ đó, bạn có hai lựa chọn:
1) Sử dụng một TypeConverter:
Sử dụng một bộ chuyển đổi loại sẽ cho phép bạn tạo một đối tượng mà không có một constructor parameterless, nhưng bạn sẽ phải cung cấp một TypeConverter rằng sẽ làm việc khởi tạo.

Bây giờ, tôi không bao giờ phải sử dụng nó, tôi không thể giúp bạn thêm về điều đó.

2) Lấy IService sử dụng ServiceLocator:

public class MyUserControl : UserControl 
{  
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
     Service = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IService>(); 
     // You can do something with Service here already. 
    } 
} 

tôi nhận ra nó là một sự thay đổi trong thiết kế của lớp học của bạn, nhưng hy vọng bạn có thể đối phó với nó.

Hy vọng điều này sẽ giúp,

Bab.

0

nếu bạn không muốn mef tạo điều khiển người dùng, bạn phải sử dụng trình soạn thảo thành phần trong bảng điều khiển người dùng của mình và gọi trực tiếp GetExport. nhưng sau đó bạn có vấn đề để có được thể hiện của compositioncontainer của bạn :)

ps: tôi để cho mef tạo các khung nhìn wpf của tôi trong các ứng dụng của tôi.

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