2012-03-07 3 views
14

Sono relativamente basso sulla curva sia per WPF che per Caliburn.Micro.Come eseguire l'associazione caliburn.micro del modello di visualizzazione al valore selezionato della casella combinata?

Il mio obiettivo qui è spostare l'associazione dell'elemento selezionato della casella combinata dal codice ShellView dietro al modello di vista, lo stesso che è già per la raccolta di elementi della 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> 

Codice Dietro (dove l'obiettivo è quello di non dover aggiungere alcun codice, se uderstand correttamente):

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

Vista Modello (attualmente fornendo la raccolta di elementi alla casella combinata e un gestore di eventi del pulsante):

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

risposta

34

È possibile associare il SelectedItem del ComboBox a una proprietà sulla vostra vista del modello:

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

In realtà, perché il vostro ComboBox ha un nome di CatalogName, le convenzioni Caliburn.Micro cercheranno una proprietà chiamata SelectedCatalogName (o ActiveCatalogName) e automaticamente legare s' SelectedItem a che il ComboBox, in modo quindi è possibile utilizzare:

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

public string SelectedCatalogName 
{ 
    ... 
} 

Un paio di cose da notare:

  • Noi chiamiamo NotifyOfPropertyChange() nel setter per il SelectedCatalog. Questo notifica all'interfaccia utente che il valore è stato modificato ogni volta che lo abbiamo impostato dal modello di visualizzazione, in modo che l'interfaccia utente venga aggiornata. Questo metodo è parte di PropertyChangedBase.
  • Si consiglia di utilizzare un tipo di raccolta che supporta le notifiche di modifica delle raccolte nei modelli di visualizzazione, ad esempio ObservableCollection fornito con WPF o Caliburn.Micro's BindableCollection (che implementa Caliburn.Micro's IObservableCollection). Ciò consente all'interfaccia utente di essere avvisata quando gli oggetti vengono aggiunti/rimossi dalle collezioni dal modello di visualizzazione.
  • Il modello di visualizzazione shell dovrebbe probabilmente implementare un tipo Screen o Conductor (anziché PropertyChangedBase) se ha un ciclo di vita (attivazione/disattivazione, ecc.) O un elemento attivo (schermo) che può cambiare a tempo di esecuzione.
+0

grazie! Ho funzionato con la proprietà SelectedItem, ma non SelectedCatalogName - tuttavia, questo è solo un bonus in ogni caso ... –

+2

Ah, si potrebbe provare a nominare la combo CatalogNames e quindi avere una proprietà CatalogNames e SelectedCatalogName. Mi aspetterei che funzioni. – devdigital

+2

sì, è stato così ... mi piace! –