Silverlight enfant de windows dans le pattern MVVM
Je suis en train d'essayer de trouver la bonne façon d'obtenir les données à partir d'un ChildWindow/popup à l'aide d'un modèle MVVM en Silverlight (3). Par exemple: j'ai une première page avec un formulaire de saisie de données et je veux ouvrir une fenêtre avec une liste de clients. Lorsque l'utilisateur sélectionne un client je veux transférer client sélectionné dans la page principale. C'est ce que l' (exemple) le code qui je suis en ce moment-là:
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 quelque chose de plus "simple"?
Cheers,
Rok
OriginalL'auteur rrejc | 2009-04-17
Vous devez vous connecter pour publier un commentaire.
Plus problématique ici est l'utilisation d'Afficher les termes spécifiques et les types de vos VMs. Cliquez sur les événements, DialogResults ne doit pas être n'importe où près de votre Viewmodel.
En ce qui concerne la question, j'ai eu une semblable question à ce sujet ici:
La manipulation des boîtes de dialogue en WPF avec MVVM
La réponse que j'ai accepté l'utilisation de l'Médiateur modèle pour obtenir autour de cette. Un coup d'oeil. 🙂
Je suis d'accord médiateur est le chemin à parcourir. Blogué à ce sujet : basaratali.blogspot.com/2010/12/...
OriginalL'auteur Ray Booysen
Une bonne MVVM bibliothèque qui prend en charge l'ouverture de fenêtre enfant est Chinch mvvm bibliothèque d'assistance. Vous pouvez regarder un échantillon à http://www.codeproject.com/KB/silverlight/SL4FileUploadAnd_SL4_MVVM.aspx.
OriginalL'auteur Peter Starbek