2009-04-17 11 views
11

में सिल्वरलाइट बाल खिड़कियां सिल्वरलाइट (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; 
    } 
} 

यह सही तरीका है या नहीं है: यह वही है जो मैं इस समय का उपयोग कर रहा है (उदाहरण के) कोड है कुछ और "सरल"?

चीयर्स, रोक

उत्तर

6

अधिक यहाँ समस्याग्रस्त देखें विशिष्ट शब्दों और अपने VMs में प्रकार का उपयोग है। ईवेंट पर क्लिक करें, संवाद दृश्य आपके ViewModels के पास कहीं भी नहीं होना चाहिए।

के साथ प्रश्न के संबंध में, मैं यहाँ इस बारे में एक समान प्रश्न था: Handling Dialogs in WPF with MVVM

जवाब मैं स्वीकार कर लिया मध्यस्थ पैटर्न के उपयोग इस के आसपास पाने के लिए किया गया था। एक नज़र देख लो। :)

+2

धन्यवाद, मैं एक नज़र डालेगा। मुझे पता चला है कि मैं इसे "पूरी तरह से" गलत कर रहा हूं और मैंने पहले से ही कमांड का उपयोग करने के लिए अपना कोड बदल दिया है (आईसीओएमएंड को बाध्यकारी) और वीएम से संवाद हटा दें। अगला कदम मध्यस्थ पैटर्न को देखना है :) – rrejc

+0

मैं सहमत हूं कि मध्यस्थ जाने का रास्ता है। इसके बारे में ब्लॉग किया गया: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

1

एक अच्छी एमवीवीएम लाइब्रेरी जो उद्घाटन बाल विंडो का समर्थन करती है चिंच एमवीवीएम हेल्पर लाइब्रेरी है। आप http://www.codeproject.com/KB/silverlight/SL4FileUploadAnd_SL4_MVVM.aspx पर एक नमूना देख सकते हैं।

संबंधित मुद्दे