J'essaie de trouver le bon moyen d'obtenir les données à partir d'un ChildWindow/popup en utilisant un modèle MVVM dans Silverlight (3). Par exemple: J'ai une page principale avec un formulaire de saisie de données et je veux ouvrir une popup avec une liste de clients. Lorsque l'utilisateur sélectionne un client, je veux transférer le client sélectionné dans la page principale. C'est ce que (par exemple) le code que je me sers au moment:Fenêtres enfants Silverlight dans le modèle MVVM
Page principale
public partial class MainPage : UserControl
{
public MainPageViewModel ViewModel { get; private set; }
public MainPage()
{
InitializeComponent();
ViewModel = new MainPageViewModel();
DataContext = ViewModel;
}
private void SearchCustomer_Click(object sender, RoutedEventArgs e)
{
ViewModel.SearchCustomer();
}
}
public class MainPageViewModel: ViewModel
{
private string customer;
public string Customer
{
get { return customer; }
set { customer = value; RaisePropertyChanged("Customer"); }
}
public void SearchCustomer()
{
// Called from a view
SearchWindow searchWindow = new SearchWindow();
searchWindow.Closed += (sender, e) =>
{
if ((bool)searchWindow.DialogResult)
{
Customer = searchWindow.ViewModel.SelectedCustomer.ToString();
}
};
searchWindow.Show();
}
}
fenêtre enfant
public partial class SearchWindow : ChildWindow
{
public SearchWindowViewModel ViewModel { get; private set; }
public SearchWindow()
{
InitializeComponent();
ViewModel = new SearchWindowViewModel();
DataContext = ViewModel;
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = ViewModel.OkButtonClick();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = ViewModel.CancelButtonClick();
}
}
public class SearchWindowViewModel: ViewModel
{
private Customer selectedCustomer;
private ObservableCollection<Customer> customers;
public ObservableCollection<Customer> Customers
{
get { return customers; }
set {customers = value; RaisePropertyChanged("Customers"); }
}
public Customer SelectedCustomer
{
get { return selectedCustomer; }
set { selectedCustomer = value; RaisePropertyChanged("SelectedCustomer"); }
}
public SearchWindowViewModel()
{
Customers = new ObservableCollection<Customer>();
ISearchService searchService = new FakeSearchService();
foreach (Customer customer in searchService.FindCustomers("dummy"))
Customers.Add(customer);
}
public bool? OkButtonClick()
{
if (SelectedCustomer != null)
return true;
else
return null; // show some error message before that
}
public bool? CancelButtonClick()
{
return false;
}
}
Est-ce la bonne façon ou est-il quoi de plus "simple"?
Cheers, Rok
Merci, je vais jeter un oeil. J'ai découvert que je le fais "complètement" faux et j'ai déjà changé mon code pour utiliser des commandes (liaison à ICommand) et enlever le résultat de dialogue de la machine virtuelle. La prochaine étape est de regarder le modèle Mediator :) – rrejc
Je suis d'accord mediator est le chemin à parcourir. Blogué à ce sujet: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat