2010-02-23 27 views
7

Tôi quan tâm đến việc biết cách bạn xử lý trạng thái chế độ xem trong ứng dụng Silverlight với mẫu MVVM. Giả sử tôi có một mặt nạ tìm kiếm đơn giản mà không đồng bộ gọi một dịch vụ web. Trong khi việc tìm kiếm đang diễn ra, tôi muốn thay đổi gui cho phù hợp: - Vô hiệu hóa nút Search - Bật nút Hủy - vvXử lý trạng thái xem trong Silverlight với MVVM

Sử dụng WPF tôi có thể tạo ra một DataTrigger mà liên kết với một số tài sản trong viewmodel và sau đó thực hiện các thay đổi cho gui. Bây giờ kể từ khi tôi không có một datatrigger trong Silverlight, những gì sẽ là cách hợp lý nhất để đạt được điều này tương tự như datatrigger (mã gọn gàng, ở một nơi nếu có thể)?

(I posted a similar question, but it was worded poorly)

Trả lời

7

cách tiêu chuẩn của tôi để làm điều này là để lộ một "ViewState" tài sản từ các mô hình điểm (thường là một enum). Khung nhìn sau đó liên kết với thuộc tính và sử dụng trình hiển thị trực quan để chuyển sang các trạng thái trực quan thích hợp tùy thuộc vào enum.

DataStateSwitchBehavior từ Expression Samples là ví dụ tốt về cách thực hiện chuyển đổi sang trạng thái trực quan.

EDIT Đáp lại bình luận

Trước hết, khi giao dịch với VisualStates sử dụng Blend (không ai bị buộc phải viết rằng nhiều XAML bằng tay). Tôi tin rằng nó thậm chí là trên tất cả (nhất?) Của các thuê bao MSDN.

Sử dụng Visual Hoa bắt đầu với Visual State Manager

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="GroupOne"> 
     <VisualState x:Name="Normal"/> 
     <VisualState x:Name="Searching"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Bạn muốn thường thêm video này vào các layoutroot.

Trình quản lý trạng thái trực quan bao gồm một tập hợp các nhóm nhà nước mà lần lượt bao gồm một tập hợp các VisualStates.

Các nhóm giữ trạng thái loại trừ lẫn nhau được tổ chức, vì bạn có thể có nhiều trạng thái trực quan hoạt động cùng một lúc nhưng chỉ có một trạng thái từ mỗi nhóm. Mẫu chuẩn là để có trạng thái rỗng gọi là "Bình thường" hoặc "Mặc định" được sử dụng để tắt các trạng thái khác. Một cơ sở nhà nước về cơ bản.

Trong trường hợp của bạn thì bạn sẽ có một "Tìm kiếm" nhà nước trực quan mà sẽ chứa một kịch bản trong đó sẽ vô hiệu hóa các nút khác nhau, kích hoạt hình ảnh động bận rộn, vv

+0

Vì vậy, tôi có thể xác định trạng thái trực quan trên điều khiển của mình (cũng trên cửa sổ con không?) Và sau đó chuyển đổi chúng bằng cách sử dụng DataStateSwitchBehavior? Ví dụ: một trạng thái có thể là 'SearchInProgress'. Làm thế nào tôi có thể sử dụng VSM để vô hiệu hóa nút để nó không thể nhấp được trong khi điều khiển nằm trong 'SearchInProgress'? –

+0

Cảm ơn Graeme. Tôi đã nhận được điều này để làm việc trong một dự án mẫu và có vẻ như đây là con đường để đi. Tuy nhiên, tôi dường như đã chạy vào cùng một vấn đề được đề cập ở đây: http://stackoverflow.com/questions/2118814/how-can-i-use-visualstates-in-a-childwindow. VSM dường như không hoạt động trong các cửa sổ con. Bây giờ tôi sẽ đặt mọi thứ trong một UserControl và tham chiếu trong cửa sổ con. Tôi đang sử dụng DataStateSwitcher mà bạn đã đề cập để biến nó thành Chế độ xem của ViewModel. –

0

Cách handiest là sử dụng BusyIndicator từ Toolkit Silverlight Tôi cho là vậy. Vì nó che khuất toàn bộ khu vực bạn áp dụng nó, tất cả các nút sẽ tự động bị tắt.

Để hủy nút, bạn phải chỉnh sửa mẫu của BusyIndicator để đặt trực tiếp bên cạnh hoạt ảnh tải mà tôi nghĩ.

Sau đó, bạn chỉ cần gắn thuộc tính IsBusy của BusyIndicator vào thuộc tính tương ứng trong ViewModel mà bạn đã đặt trước khi tải và đặt lại khi bạn hoàn tất.

0

Giải pháp của tôi tương tự như Graeme Bradbury, NHƯNG tôi không sử dụng DataStateSwitchBehavior, bởi vì nếu điều khiển X của tôi được đặt bên trong bảng điều khiển (hoặc cái gì đó tương tự) và trạng thái thay đổi trong khi tôi đang ở trên tab khác, thì tôi ' sẽ nhận được một ngoại lệ ('element' không tìm thấy ..). Ngoại lệ được ném bởi vì điều khiển X của tôi không được tải trong khi tôi đang ở trên một tab khác và các phần tử cần được cập nhật không được tìm thấy.

Vì vậy, đây là những gì tôi làm:

Trong mô hình quan điểm của tôi Tôi có một VisualState tài sản đó gửi một thông điệp thông báo khi thay đổi trạng thái (tôi sử dụng MVVM light toolkit):

private string visualState = XVisualStates.InitialState; 
    public string VisualState 
    { 
     get 
     { 
      return visualState; 
     } 

     set 
     { 
      visualState = value; 
      Messenger.Default.Send(new XStateChangedMessage(value)); 
     } 
    } 

và trong mã Quan điểm của tôi của đằng sau tôi đăng ký thông báo:

public partial class XControl : UserControl 
{ 
    private string visualState = XVisualStates.InitialState; 
    public XControl() 
    { 
     InitializeComponent(); 

     //go to state when view is loaded 
     Loaded += (s, e) => ChangeState(); //every time a view is loaded go to current state 

     //change visual state when a notification is received 
     Messenger.Default.Register<XStateChangedMessage>(this, 
      state => 
      { 
       visualState = state.CurrentState; //save current state 
       ChangeState(); 
      }); 
    } 

    void ChangeState() 
    { 
     try 
     { 
      VisualStateManager.GoToState(this, visualState, true); //will throw an exception if current view is unloaded 
     } 
     catch 
     { 
      //NOTE: supress 'element' not found errors if user navigated to another view and state changes 
     } 
    } 
} 

và XStateChangedMessage là một lớp đơn giản:

public class XStateChangedMessage 
{ 
    public string CurrentState { get; private set; } 

    public XStateChangedMessage (string currentState) 
    { 
     CurrentState = currentState; 
    } 
} 
0

1) Bạn có thể tạo nội dung như thuộc tính IsEnabledSearch trong mô hình xem và liên kết nó với thuộc tính Có thể xem hoặc hiển thị của nút (bạn sẽ cần Trình chuyển đổi hiển thị Bool thành Visibility). Tạo ra các nước trực quan mới chỉ vì điều đó không hiệu quả lắm, bởi vì các nút của bạn đã có tất cả các trạng thái trực quan bên trong để hỗ trợ hành vi này.

2) khung công tác mvvm Jounce có triển khai rất tốt đẹp để hỗ trợ VisualStates từ ViewModel; Jounce Visual State Manager

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