A ver si alguien puede ayudarme con este pequeño dilema de WPF.
Mi aplicación es una ventana donde solo puede haber una View.
Desde una View, puedes navegar a otra View, y luego volver a la anterior, o navegar a otra más, etc...
Estas Views las voy metiendo en una pila, cuando navegas a una, la inserto en la pila y la muestro. Cuando sales de la View, la saco de la pila, y te muestro la que había antes.
Por ejemplo.. Estoy en la View "Listado de Clientes", y tiene un botón "Insertar Cliente". Al pulsar el botón, voy a la View "Insertar Cliente", ocultándose la View "Listado Clientes".
Al guardar el cliente, cierro la View "Insertar Cliente", y se vuelve a mostrar la que había justo detrás de esa, que es "Listado de Clientes".
Para hacer esto tengo lo siguiente:
- Tengo una clase estática WindowManager, que contiene la Lista de UserControls que se van mostrando. Y con dos métodos: ExecuteUI(UserControl control) que inserta un elemento, y FinalizeUI(), que elimina el primer elemento de la lista.
Código Java:
Ver original
public static class WindowManagerUI { #region ListViews private static object _listViewsLock = new object(); private static ObservableCollection<UserControl> _listViews; public static ObservableCollection<UserControl> ListViews { get { if (_listViews == null) { _listViews = new ObservableCollection<UserControl>(); BindingOperations.EnableCollectionSynchronization(_listViews, _listViewsLock); } return _listViews; } } public static event ExecuteEvent OnExecute; #endregion public static void ExecuteUI(UserControl control) { ListViews.Insert(0, control); if (OnExecute != null) OnExecute(new ExecuteEventArgs(control, EActionExecute.Load)); } public static void FinalizeUI() { ListViews.RemoveAt(0); if (OnExecute != null) OnExecute(new ExecuteEventArgs(null, EActionExecute.UnLoad)); } }
- Tengo una clase ViewModelBase, que tiene una propiedad CurrentUI, que devuelve el ultimo UserControl insertado en WindowManager, y un Evento, que cada vez que la lista de WindowManager es alterada, refresca la propiedad CurrentUI.
Código Java:
Ver original
public class ViewModelBase : PropertyChangedBase { #region PROPERTIES public UserControl CurrentUI { get { return WindowManagerUI.ListViews.Count.Equals(0) ? null : WindowManagerUI.ListViews[0]; } } #endregion #region METHODS protected void ExecuteUI(UserControl control) { WindowManagerUI.ExecuteUI(control); } protected void FinalizeUI() { WindowManagerUI.FinalizeUI(); } #endregion #region EVENTS private void WindowManagerUI_OnExecute(ExecuteEventArgs e) { NotifyOfPropertyChange(() => this.CurrentUI); } #endregion public ViewModelBase() { WindowManagerUI.OnExecute += WindowManagerUI_OnExecute; } }
Bien... esto funcionar funciona perfectamente. Desde cualquier ViewModel, navego al UserControl que me de la gana, me lo muestra, y cuando lo finalizo, me muestra el anterior.
Código Java:
Ver original
//Desde un ViewModel, por ejemplo, al pulsar un botón: this.ExecuteUI(new LoginUI()); //En el ViewModel del LoginUI, finalizo dicho UserControl, y se me mostrará el anterior. //this.Finalize();
Pero.. no es la filosofía que me gustaría, ya que así no soy capaz de recibir un Resultado de las vistas.
Buscaría algo como:
Código Java:
Ver original
CustomResult result = this.ExecuteUI(new LoginUI());
En fin... mi intención es hacer algo para que cada vez que ejecute un UserControl, poder devolver un objeto. Que será desde Null, hasta lo que sea... Luego ya me organizaré para devolver una clase específica.
Pero la idea es... conseguir que un UserControl devuelva un resultado.
¿Alguien con experiencia en WPF me puede orientar, para hacerlo de la forma correcta?
Gracias.