Silverlight дочерние окна в шаблоне MVVM - PullRequest
11 голосов
/ 17 апреля 2009

Я пытаюсь найти правильный способ получить данные из ChildWindow / всплывающего окна, используя шаблон MVVM в Silverlight (3). Например: у меня есть главная страница с формой ввода данных, и я хочу открыть всплывающее окно со списком клиентов. Когда пользователь выбирает клиента, я хочу перенести выбранного клиента на главную страницу. Вот какой (пример) код, который я сейчас использую:

Главная страница

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();
    }
}

Детское окно

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;
    }
}

Это правильный путь или есть что-нибудь более "простое"?

Ура, Rok

Ответы [ 2 ]

6 голосов
/ 20 апреля 2009

Более проблематичным здесь является использование Просмотр определенных терминов и типов в ваших виртуальных машинах. События кликов, DialogResults не должно быть рядом с вашими ViewModels.

Что касается вопроса, у меня был похожий вопрос по этому поводу здесь: Обработка диалогов в WPF с MVVM

Ответ, который я принял, заключался в использовании паттерна посредника, чтобы обойти это. Посмотри. :)

1 голос
/ 02 июля 2010

Хорошая библиотека MVVM, которая поддерживает открытие дочернего окна: Chinch mvvm helper library . Вы можете посмотреть образец на http://www.codeproject.com/KB/silverlight/SL4FileUploadAnd_SL4_MVVM.aspx.

...