2012-03-07 13 views
14

मैं डब्ल्यूपीएफ और कैलिबर्न दोनों के लिए वक्र पर अपेक्षाकृत कम हूं। माइक्रो।चयनित मूल्य को combobox करने के लिए देखने मॉडल के caliburn.micro बाध्यकारी कैसे करें?

मेरा लक्ष्य यहां शेलव्यू के कोड से दृश्य मॉडल में कंबोबॉक्स चयनित आइटम के बाध्यकारी को स्थानांतरित करना है, जैसा कि यह पहले से ही combobox के आइटम संग्रह के लिए है।

XAML:

<Window x:Class="EomDatabaseUtility.Views.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Eom Tool Database Utility" Height="350" Width="525"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="258" HorizontalAlignment="Left" Margin="12,41,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" /> 
     <Button Content="Execute" Height="23" HorizontalAlignment="Left" Margin="416,12,0,0" VerticalAlignment="Top" Width="75" x:Name="Execute" /> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="120" x:Name="CatalogName" SelectedValuePath="{Binding Path=SelectedCatalogName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</Window> 

कोड के पीछे (जहां लक्ष्य किसी भी कोड जोड़ने के लिए, अगर मैं सही ढंग से uderstand नहीं है):

namespace EomDatabaseUtility.Views 
{ 
    using System.Windows; 

    public partial class ShellView : Window 
    { 
     public ShellView() 
     { 
      InitializeComponent(); 
     } 

     // --> This should go in the view model, Right? 
     private string selectedCatalogName; 
     public string SelectedCatalogName 
     { 
      get { return selectedCatalogName; } 
      set { selectedCatalogName = value; } 
     } 
    } 
} 

देखें मॉडल (वर्तमान में कंबोबॉक्स के साथ-साथ एक बटन इवेंट हैंडलर के आइटमों की संग्रह की आपूर्ति):

namespace EomDatabaseUtility.ViewModels 
{ 
    using Caliburn.Micro; 
    using System.Collections.Generic; 

    public class ShellViewModel : PropertyChangedBase 
    { 
     public List<string> CatalogName 
     { 
      get 
      { 
       return new List<string> { "foo", "bar" }; 
      } 
     } 

     public void Execute() 
     { 
      System.Windows.MessageBox.Show("hello"); 
     } 
    } 
} 

उत्तर

34

आप ComboBox की SelectedItem एक संपत्ति के लिए अपने दृश्य मॉडल पर बाध्य कर सकते हैं:

<ComboBox x:Name="CatalogName" ... SelectedItem="{Binding SelectedCatalog}" /> 

public class ShellViewModel : PropertyChangedBase 
{ 
    private string selectedCatalog; 

    public List<string> CatalogName 
    { 
     get 
     { 
      return new List<string> { "foo", "bar" }; 
     } 
    } 

    public string SelectedCatalog 
    { 
     get 
     { 
      return this.selectedCatalog; 
     } 

     set 
     { 
      this.selectedCatalog = value; 
      this.NotifyOfPropertyChange(() => this.SelectedCatalog); 
     } 
    } 

वास्तव में, क्योंकि आपके ComboBoxCatalogName का एक नाम है, Caliburn.Micro सम्मेलनों के लिए दिखेगा एक संपत्ति SelectedCatalogName (या ActiveCatalogName) और स्वचालित रूप से कहा जाता है ComboBox के SelectedItem कि करने के लिए बाध्य है, तो इसलिए आप उपयोग कर सकते हैं:

<ComboBox x:Name="CatalogName" ... /> 

public string SelectedCatalogName 
{ 
    ... 
} 

कुछ बातें ध्यान रखें:

  • हम SelectedCatalog के लिए सेटर में NotifyOfPropertyChange() कहते हैं। यह यूआई को सूचित करता है कि जब भी हम इसे दृश्य मॉडल से सेट करते हैं तो मूल्य बदल जाता है, ताकि यूआई अपडेट हो जाए। यह विधि PropertyChangedBase का हिस्सा है।
  • आप वास्तव में एक संग्रह प्रकार है जो संग्रह आपके विचार मॉडल में सूचनाएं बदल का समर्थन करता है, इस तरह के रूप ObservableCollection जो WPF के साथ आता है Caliburn.Micro के BindableCollection (जो Caliburn.Micro के IObservableCollection लागू करता है) का उपयोग करना चाहिए, या। यह दृश्य मॉडल से आपके संग्रह से ऑब्जेक्ट जोड़े/हटाए जाने पर UI को अधिसूचित करने की अनुमति देता है।
  • आपका खोल दृश्य मॉडल शायद Screen या Conductor प्रकार (PropertyChangedBase के बजाय) को लागू करना चाहिए यदि उसके पास जीवन चक्र (सक्रियण/निष्क्रियता इत्यादि) हो या वर्तमान में सक्रिय आइटम (स्क्रीन) हो जो कि बदल सकता है रन टाइम
+0

धन्यवाद! मैंने इसे चयनित इटैम संपत्ति के साथ काम किया है, लेकिन चयनितसूची नाम नहीं है - हालांकि, यह सिर्फ एक बोनस है ... –

+2

आह, आप combobox CatalogNames नामकरण करने का प्रयास कर सकते हैं, और फिर कैटलॉग नाम संपत्ति और चयनितCatalogName है। मैं काम करने की उम्मीद करता हूं। – devdigital

+2

हाँ, यह किया .. मुझे पसंद है! –

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