2009-09-18 21 views
5

Tôi đang cố gắng sử dụng MVP trong WinForms và đang bối rối về cách xử lý tốt nhất sự phối hợp giữa các chế độ xem con.Sự phối hợp các quan điểm của trẻ được xử lý tốt nhất trong MVP như thế nào?

Ví dụ: tôi có chế độ xem gốc có hai chế độ xem con. Các sự kiện trên một chế độ xem con cần phải thực hiện hành động được thực hiện theo chế độ xem con thứ hai.

Chế độ xem gốc có nên kiểm soát trực tiếp điều này không? Có vẻ như tôi đang bỏ qua mẫu MVP bằng cách làm điều này.

Hoặc các chế độ xem con có nên coi nhau như tham số hàm tạo không? Trong trường hợp đó, khi một sự kiện được kích hoạt bởi chế độ xem con đầu tiên, chế độ xem con thứ hai sẽ nhận được sự kiện và sau đó thông báo cho người trình bày rằng có điều gì đó đã xảy ra? Người trình bày sau đó cần lấy dữ liệu từ khung nhìn con đầu tiên (mà nó thậm chí không biết) để nói cho đứa trẻ thứ 2 xem phải làm gì. Nó có vẻ phức tạp vì vậy tôi cảm thấy như tôi đang thiếu một cái gì đó.

Dưới đây là một số giả mã cho tình trạng này:

public class ParentView : UserControl, IParentView 
{ 
    private ChildViewOne childViewOne; 
    private ChildViewTwo childViewTwo; 
    private ParentViewPresenter presenter; 

    private RegisterEvents() 
    { 
     childViewOne.EventOccured += new EventHandler(HandleEvent); 
    } 

    private void HandleEvent() 
    { 
     childViewTwo.DoSomething(); 
    } 
} 
+0

"Sự kiện trên một chế độ xem trẻ em cần phải thực hiện hành động bằng chế độ xem con thứ hai". Chính xác những hành động diễn ra là gì? – SwDevMan81

+0

Ví dụ: giả sử childViewOne là dòng thời gian và childViewTwo là video. Dòng thời gian cho thấy sự kiện TimeChanged và video cần phản hồi sự kiện đó bằng cách thay đổi khung hiện tại của video. – jameswelle

Trả lời

0

Bạn có thể xem Event Aggregator pattern. Nó sẽ cho phép bạn giữ tất cả mọi thứ lỏng lẻo cùng. Prism đi kèm với một và nó dễ dàng, đủ để sử dụng mà không cần phải mua vào toàn bộ khung Prism/thư viện.

Mã của bạn sau đó có thể trông như thế này:

public class ChildViewOne { 
    private IEventAggregator evtAggregator; 

    public ChildViewOne(IEventAggregator evtAggregator) { 
     this.evtAggregator = evtAggregator; 
    } 

    private void OnEventOccured(){ 
     evtAggregator.GetEvent<EventOccured>().Publish(); 
    } 
} 

publish class ChildViewTwo { 
    private IEventAggregator evtAggregator; 

    public ChildViewTwo(IEventAggregator evtAggregator) { 
    evtAggregator.GetEvent<EventOccured>().Subscribe(OnEventOccured); 
    } 

    private void OnEventOccured() { 
     // Do something here... 
    } 
} 

EDIT: Brian Noyes đã chuyển các aggregator sự kiện lăng kính để winforms. Hãy xem nó ra here, on his blog

0

Lấy views con khác trong xây dựng có vẻ như một ý tưởng tồi. Bạn sẽ làm gì nếu một lượt xem con khác cần được thêm vào trong tương lai?

Sẽ tốt hơn nếu bạn định tuyến sự kiện con của mình thông qua chế độ xem gốc. Làm thế nào bạn vi phạm MVP nếu bạn định tuyến các sự kiện của mình thông qua chế độ xem gốc?

+0

Bạn có nghĩa là như tôi đang làm hiện tại hoặc nếu ParentView đã phơi bày sự kết hợp của tất cả các sự kiện của con cái và chỉ thông qua các sự kiện thông qua người trình bày của nó? – jameswelle

0

Tôi sẽ tạo thuộc tính của giao diện IChildView có tên là SiblingView (hoặc điều gì đó phù hợp hơn với ngữ cảnh kinh doanh của ứng dụng của bạn). Bạn thậm chí không cần phải thêm nó như là một param trong constructor, nhưng có giao diện bao gồm một phương thức gọi là SetSiblingView(). Bạn có thể gọi nó từ nhà xây dựng. Sau đó bạn có thể có một sự kiện OnSiblingEventFired().

Dường như ít phức tạp hơn với tôi, nhưng có lẽ điều đó chỉ vì đó là cách tôi đã tiếp cận loại vấn đề này trong quá khứ.

Nhưng tôi đồng ý, mà không biết quá nhiều chi tiết khi cha mẹ kiểm soát nó dường như không tuân theo mẫu MVC.

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