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;
}
}
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'? –
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. –