2011-12-18 31 views
8

Tôi đang xây dựng một ứng dụng sử dụng khá nhiều lệnh và chúng đang làm lộn xộn lên chế độ xem của tôi. MVVM là mới đối với tôi, vì vậy xin lỗi nếu câu hỏi này là một chút ngu ngốc. Có cách nào để giảm sự lộn xộn không? Ví dụ ở đây bạn sẽ nhìn thấy một phần của sự lộn xộn ..Làm cách nào để tránh lệnh lộn xộn trong ViewModel?

private void InitializeCommands() 
    { 
     LogoutCommand = new RelayCommand(Logout); 
     OpenCommand = new RelayCommand(SetImage); 
     SaveCommand = new RelayCommand(SaveImage, SaveImageCanExecute); 
     UploadToFlickrCommand = new RelayCommand(UploadToFlickr); 
     CropCommand = new RelayCommand(SetCropMouseEvents); 
     RemoveRedEyeCommand = new RelayCommand(SetRemoveRedEyeMouseEvents); 
     TextInputCropCommand = new RelayCommand(CropFromText); 
     ReloadImageCommand = new RelayCommand(ReloadImage); 
     FlipYCommand = new RelayCommand(FlipY); 
     Rotate90RCommand = new RelayCommand(Rotate90R); 
     FlipXCommand = new RelayCommand(FlipX); 
     ToGrayscaleCommand = new RelayCommand(ToGrayscale); 
     ToSepiaCommand = new RelayCommand(ToSepia); 
     WindowClosingCommand = new RelayCommand(WindowClosing); 
     EffectsViewCommand = new RelayCommand(() => CurrentToolView = new EffectsView()); 
     AddTextCommand = new RelayCommand(() => CurrentToolView = new AddTextView()); 
     ResizeCommand = new RelayCommand(() => CurrentToolView = new ResizeView()); 
     CropViewCommand = new RelayCommand(() => CurrentToolView = new CropView()); 
     RedEyeCommand = new RelayCommand(() => CurrentToolView = new RedEyeView()); 
     RotateViewCommand = new RelayCommand(() => CurrentToolView = new RotateView()); 
     ExitCommand = new RelayCommand(() => Application.Current.Shutdown()); 
     FullscreenCommand = new RelayCommand(() => 
               { 
                var fs = new FullscreenView 
                    {FullscreenImage = CurrentImage.LoadedImage}; 
                fs.Show(); 
               }); 
     HandleDropCommand = new RelayCommand<DragEventArgs>(e => OnFileDrop(this, e)); 
     Messenger.Default.Register<User>(this, "UserLogin", SetUser); 
     Messenger.Default.Register<FlickrAccount>(this, "AddedAccount", AddAccount); 
     Messenger.Default.Register<string>(this, "INeedAUser", SendUser); 
     Messenger.Default.Register<string>(this, "INeedAImage", SendImage); 
    } 
+0

Tôi cũng muốn được xem câu trả lời hay cho điều này, nhưng AFAIK đây là mức giá phải trả cho việc có tất cả sự tốt đẹp khớp nối lỏng lẻo. – Jon

Trả lời

5

Vì vậy, bạn có lệnh cho:

  1. hoạt động File (Open, Save, Tải lên Flicker)

  2. hoạt động Window (Full màn hình, Close)

  3. Editing (Rotating, Thay đổi kích thước, Màu sắc, v.v.)

Cân nhắc nhóm (com đặt ra) các lệnh liên quan với nhau trong một lớp tùy chỉnh được gọi là ví dụ FileCommands. Tạo phân cấp đa cấp nếu có. Nếu bạn có một trình đơn phân cấp trong chế độ xem của mình, bạn có thể sẽ muốn có Hệ thống phân cấp lệnh tương tự.

Sau đó, tạo một Bộ điều khiển cho mỗi nhóm lệnh (ví dụ FileController) và trong phương pháp tạo bộ điều khiển sẽ đăng ký lệnh từ nhóm FileCommands với dịch vụ liên quan.

Xem http://waf.codeplex.com/ ứng dụng mẫu (ví dụ BookController.cs) để biết một số ý tưởng về cách thực sự triển khai ánh xạ Controller/ViewModel. Tuy nhiên, lưu ý rằng đó không phải là kịch bản chính xác giống nhau (không vi phạm Lệnh thành các nhóm).

+0

Rất thú vị, tôi thích ý tưởng đó. Có vẻ hơi phức tạp (đối với tôi như một người mới) nhưng tôi sẽ xem xét nó và cho bạn biết tôi đã đi như thế nào! Cảm ơn bạn đã trả lời của bạn :) –

+0

Nếu bạn không muốn điều khiển được nêu ra sau đó chỉ cần nhóm liên quan đến các lệnh như đề xuất và chia tách InitializeCommands phương pháp thành InitializeFileCommands, InitializeWindowCommands vv – surfen

0

ViewModel của bạn là nghĩa là keo giữa View và Model. Điều này ngụ ý rằng, trừ khi bạn có thể lặp lại một cách tổng quát Mô hình, nó sẽ luôn bao gồm một liệt kê 'các dòng keo'.

Sự lộn xộn duy nhất tôi có thể tưởng tượng bạn có thể loại bỏ là trong trường hợp bạn không cần thuộc tính XXXCommand theo nghĩa đen; trong trường hợp đó, bạn có thể tạo ra một bộ sưu tập, cấu trúc sở hữu như tương tự (pseudo-code)

private void createCommands() { 
    var commands={ 
     "Logout"=>new RelayCommand(Logout), 
     "Exit"=>new RelayComand(()=>Application.Current.Shutdown()), 
    .... 
    }; 
    foreach(var key,cmd in commands){ 
     glue(key,cmd); 
    } 
}; 

Không có lý do khác để giữ tham chiếu đến các đối tượng bạn tạo ở đây trừ Máy dán chúng vào đúng Xem chất kết dính.

Nhưng sau đó một lần nữa, tại sao không sử dụng thành ngữ Thuộc tính cho điều này? Một lần nữa: số lượng lộn xộn, như tôi thấy nó, là hợp lý hạn chế.

+0

Cảm ơn câu trả lời của bạn, tôi sẽ xem xét lại mã cũng như hỏi giáo viên của tôi vào ngày mai.Tôi sẽ đăng lại mã sau và bạn có thể thấy kết quả :) –

+0

Chỉ cần một lưu ý: Việc đặt tên trong các chuỗi làm cho chúng ẩn với trình biên dịch (nghĩa là nó không thể kiểm tra tính nhất quán). Mặt khác; nó cũng không thể kiểm tra xem một tài sản được sử dụng hay không ... – FrankB

1

Sử dụng Micro Caliburn. Đối với một nút có tên name = "Logout", thứ duy nhất cần thiết trong ViewModel là một phương thức công khai có tên Logout.

Và không có ràng buộc convetion:

<Button Content="Remove" 
     cal:Message.Attach="[Event Click] = [Action Remove($dataContext)]" /> 

Sau đó trên ViewModel thêm một phương thức có tên Remove và trong mẫu mà các DataContext được truyền cho phương pháp này.

+0

Caliburn Micro là gì, và dễ dàng như thế nào để bắt đầu với nó? Chúng tôi hiện đang sử dụng ánh sáng MVVM, chúng có thể được sử dụng cùng nhau không? Cảm ơn bạn đã trả lời của bạn :) –

+0

CM là một quy ước dựa trên MvvM framwork cho WPF & SL. http://caliburnmicro.codeplex.com/. Bắt đầu không phải là xấu nhưng tôi không nghĩ rằng bạn sẽ sử dụng cả hai cùng một lúc. –

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