2010-09-07 31 views
11

Tôi đang tìm một mẫu chứng minh theo cách nhẹ nhất có thể như sau:Mẫu MVVM-Light WP7 siêu đơn giản?

Mô hình gọi một dịch vụ web dựa trên SOAP; thường xuyên bỏ phiếu để có được giá trị mới nhất (giả sử dịch vụ SOAP trả về một boolean). Mô hình cũng nên hỗ trợ gọi phương thức SOAP để thay đổi boolean trên máy chủ.

Chế độ xemMô hình cho phép boolean cơ bản bị ràng buộc với các điều khiển trong Chế độ xem (ví dụ: để hộp kiểm).

Chế độ xem với điều khiển hộp kiểm bên trên được ràng buộc với boolean cơ bản. Tùy thuộc vào khoảng thời gian thăm dò, hộp kiểm sẽ cập nhật khi trạng thái của máy chủ thay đổi. Nếu hộp kiểm được nhấp vào sự kiện sẽ được gửi đến mô hình khiến máy chủ được cập nhật.

Tối ưu mẫu này sẽ hoạt động trên Windows Phone 7, nhưng trong một pinch tôi muốn được hạnh phúc với cái gì đó hỗ trợ SL3 (không sử dụng định tuyến lệnh SL4 cho phép).

Tôi đang cố gắng tìm hiểu cách làm cho MVVM-Light hoạt động cho tôi và tôi nghi ngờ rằng một chuyên gia có thể viết mã mẫu như thế này rất nhanh ... Tôi cũng nghi ngờ đây là một mô hình khá phổ biến cho rất nhiều ứng dụng.

+0

Việc bỏ phiếu cho máy chủ từ thiết bị di động tốt nhất là có mùi mã nhưng thường là chống mẫu vì nó có tác động sử dụng tài nguyên. Bạn nên xem xét việc có quá trình máy chủ gửi thông báo khi giá trị trả về bởi các thay đổi của dịch vụ. Bạn cũng có thể nhận được nhiều trợ giúp hơn nếu bạn có thể chứng minh những gì bạn đã thử và các vấn đề bạn gặp phải. Yêu cầu ai đó viết một ví dụ làm việc hiếm khi là một chiến lược thành công để được hỗ trợ. –

+0

Nhận xét công bằng về việc viết một ứng dụng với các yêu cầu cụ thể cho ai đó, nhưng nếu mẫu có sẵn thể hiện ít nhất một trong những nguyên tắc cơ bản chính có thể được liên kết thì đó là sự khởi đầu để xây dựng. –

Trả lời

8

Mick N giúp, nhưng những gì thực sự đã cho tôi qua cái bướu là bài này bởi Jeremy Likness: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

Dưới đây là các mẫu vì lợi ích của người khác (giả sử tôi không làm bất cứ điều gì thực sự ngu ngốc):

Trước tiên, tôi bắt đầu sử dụng dự án Mvvm-Light Windows Phone 7.

tôi thêm một hộp kiểm để MainPage.xaml tôi:

<CheckBox Content="Switch 1" 
       IsChecked="{Binding Switch1.PowerState, Mode=TwoWay}" 
       Height="72" HorizontalAlignment="Left" Margin="24,233,0,0" 
       Name="checkBox1" VerticalAlignment="Top" Width="428" /> 

Thông báo các IsChecked là ràng buộc để Switch1.PowerState sử dụng chế độ TwoWay để sở hữu chảy cả hai cách.

Một khóa học quan trọng đối với tôi là làm thế nào để cho phép giao tiếp từ bộ đếm thời gian gọi lại của tôi (TimerCB) sẽ chạy trên một chủ đề mới đến chuỗi giao diện người dùng Silverlight. Tôi đã sử dụng trình trợ giúp Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI đợi trên chuỗi giao diện người dùng.

Sau đó tôi đã quyết định có nên thực hiện INotifyPropertyChanged bản thân mình trong mô hình của tôi hay sử dụng triển khai ViewModelBase của Mvvm-Light hay không. Tôi thực sự đã thử nó cả hai cách và đã làm việc nhưng quyết định tôi thích sử dụng ViewModelBase tốt hơn bởi vì nó hỗ trợ "phát sóng" và tôi nghĩ rằng trong dự án thực tế của tôi sẽ có ích bởi vì tôi sẽ có nhiều ViewModels. Có vẻ hơi thô lỗ khi dựa trên một "Mô hình" trên lớp ViewModelBase, nhưng tôi không nghĩ rằng có bất kỳ tác hại nào trong việc làm như vậy. (???).

Mô hình .cs của tôi bên dưới.

public class OnOffSwitchClass : ViewModelBase // ignore that it's derived from ViewModelBase! 
{ 
    private const Int32 TIMER_INTERVAL = 5000; // 5 seconds 
    private Timer _timer; 

    // Upon creation create a timer that changes the value every 5 seconds 
    public OnOffSwitchClass() 
    { 
     _timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL); 
    } 

    private static void TimerCB(object state) 
    { 
     // Alternate between on and off 
     ((OnOffSwitchClass)state).PowerState = !((OnOffSwitchClass)state).PowerState; 
    } 

    public const string PowerStatePropertyName = "PowerState"; 

    private bool _myProperty = false; 

    public bool PowerState 
    { 
     get 
     { 
      return _myProperty; 
     } 

     set 
     { 
      if (_myProperty == value) 
      { 
       return; 
      } 

      var oldValue = _myProperty; 
      _myProperty = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
       RaisePropertyChanged(PowerStatePropertyName, oldValue, value, true)); 
     } 
    } 
} 

Các MainViewModel.cs đã được sửa đổi để bao gồm

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

public OnOffSwitchClass Switch1 
{ 
    get 
    { 
     return _Switch1; 
    } 
} 

Và tôi đã thêm một cuộc gọi đến DispatcherHelper.Initialize(); trong hàm tạo ứng dụng() của tôi.

Điều này có đúng không?

+1

Theo như câu hỏi mô hình, trong WP7 tôi sử dụng một lớp mô hình để đọc/ghi vào bộ nhớ thoáng qua và bộ nhớ Isolated. ViewModels dùng để trình bày dữ liệu bị ràng buộc bởi Views/Pages. Nếu bạn đang sử dụng Mô hình của mình như mô hình chế độ xem thì có thể đó là mô hình xem. –

+0

Tôi thích gọi DispatcherHelper.Initialize() trong cả hai phương thức Appliance_Launching và Appliance_Activated của App.xaml.cs. –

+0

Cảm ơn Matt - tại sao trong _Launching & _Activated và không phải trong nhà xây dựng? – tig

3

Kiểm tra bài đăng trên blog này của Joost van Schaik gần đây đã được liên kết (bởi kP từ bộ nhớ?) Trên các diễn đàn wp7.

http://dotnetbyexample.blogspot.com/2010/07/using-mvvm-light-to-drive-windows-phone.html

tôi nghi ngờ bạn sẽ tìm thấy một "mẫu" mà cũng xảy ra để thực hiện "yêu cầu" của bạn, nhưng ít nhất là với một mẫu mà những gì tiêu đề câu hỏi của bạn mô tả bạn có thể học và sau đó áp dụng nhiều bạn yêu cầu chi tiết cho nó. con trỏ

+0

Ví dụ của Joost cũng rất hữu ích đối với tôi. Nó không đơn giản như tôi đã hy vọng, nhưng nó đã phơi bày một vài mẫu quan trọng. Cảm ơn. – tig

+0

yw :)/15char .. –

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