2011-07-29 13 views
5

Tôi có ứng dụng MVVM WP7 trong đó tôi đang cố gắng gửi giá trị từ một Page/ViewModel đến contructor của ViewModel thứ hai. Tôi đã có Ninject thiết lập và nhận được điều này để làm việc với một giá trị thử nghiệm tĩnh sử dụng một dòng như:Ninject: Thực hiện WithConstructorArgument (tên chuỗi, Func <IContext, đối tượng> gọi lại)

this.Bind<TaskViewModel>().ToSelf().WithConstructorArgument("TaskID", 2690) 

Một lần nữa, làm việc với một giá trị tĩnh nhưng tôi cần nó để được một biến bởi người sử dụng lựa chọn. Tôi đã được yêu cầu sử dụng quá tải

WithConstructorArgument(string name, Func<IContext,object> callback). 

Tôi cho rằng cuộc gọi lại này sẽ gọi hàm trên ViewModel đầu tiên và nhận giá trị.

Nhưng tôi đã không thành công, dễ dàng thừa nhận tôi không có kinh nghiệm trong Ninject hoặc sử dụng đối số gọi lại Func. Tôi đã thử thiết lập một đại biểu và chức năng để có được giá trị từ ViewModel đầu tiên nhưng điều đó cho một lỗi nói rằng tôi đang cố gắng để vượt qua trong một loại. Làm thế nào chính xác để tôi xác định rằng đối số để sử dụng một cuộc gọi lại và tôi có đúng để sử dụng một đại biểu trong ViewModel đầu tiên hoặc cái gì khác?

+1

Bạn có chắc chắn rằng đây là ý tưởng tốt để sử dụng tiêm phụ thuộc theo cách như vậy? Tôi có nghĩa là để giải quyết phụ thuộc thành phần dựa trên đầu vào của người dùng? –

+0

Nó đã được giới thiệu cho tôi bởi một người mà tôi cho là rất am hiểu về Ninject, như tôi đã nói trong câu hỏi của mình, tôi không. Nếu bạn có một giải pháp phù hợp thats phù hợp với MVVM tôi chắc chắn mở để thay đổi cách tiếp cận của tôi. – Walter

+1

@Waltedbn: Remo Gloor là nhà phát triển hoạt động hiện tại của dự án Ninject. Anh ấy là người thông thái nhất về chủ đề này trên thế giới. Nghe anh ấy. – StriplingWarrior

Trả lời

5

Như tôi đã nói trong bài đăng khác của bạn vượt qua các đối số trên có được có lẽ là cách tốt hơn. Do tạo ra một giao diện máy

public interface ITaskViewFactory 
{ 
    TaskViewModel CreateTaskViewModel(int id); 
} 

Trong bootstrapper của bạn (Việc lắp ráp có trách nhiệm để tạo ra tất cả mọi thứ bằng Ninject, chúng ta bình thường là một khác hơn nơi bạn thực hiện tất cả mọi thứ với giá trị kinh doanh) thêm việc thực hiện

Public class TaskViewFactory : ITaskViewFactory 
{ 
    Private IKernel kernel; 
    Public TaskViewFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public TaskViewModel CreateTaskViewModel(int taskId) 
    { 
     this.kernel.Get<ITaskViewModel>(new ConstructorArgument("TaskId", taskId); 
    } 
} 

Sau đó, tiêm nhà máy vào lệnh chọn nhiệm vụ của bạn và gọi nhà máy khi một công việc được chọn.

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