2012-03-07 12 views
14

Estoy relativamente bajo en la curva tanto para WPF como para Caliburn.Micro.¿Cómo hacer el modelo de vinculación de vista de caliburn.micro al valor seleccionado de combobox?

Mi objetivo aquí es mover el enlace del elemento seleccionado del combobox del código de ShellView al modelo de vista, al igual que para la colección de elementos del 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> 

Código Detrás (donde el objetivo es no tener que añadir ningún código, si uderstand correctamente):

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

Ver Modelo (actualmente suministrando la colección de artículos al combobox así como a un manejador de eventos de botón):

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

Respuesta

34

puede enlazar las SelectedItem del ComboBox a una propiedad del modelo de vista:

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

De hecho, debido a que su ComboBox tiene un nombre de CatalogName, las convenciones Caliburn.Micro buscarán una propiedad llamada SelectedCatalogName (o ActiveCatalogName) y automáticamente obligar a la ComboBox 's SelectedItem a que, por lo tanto, por lo que puede utilizar:

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

public string SelectedCatalogName 
{ 
    ... 
} 

Un par de cosas a tener en cuenta:

  • Llamamos NotifyOfPropertyChange() en la incubadora para el SelectedCatalog. Esto notifica a la interfaz de usuario que el valor ha cambiado cada vez que lo configuramos desde el modelo de vista, de modo que la interfaz de usuario se actualiza. Este método es parte de PropertyChangedBase.
  • realmente debería utilizar un tipo de colección que apoya la colección cambió notificaciones en sus modelos de vista, tales como ObservableCollection que viene con WPF, o Caliburn.Micro de BindableCollection (que implementa Caliburn.Micro de IObservableCollection). Esto permite que se notifique a la UI cuando se agregan/eliminan objetos de sus colecciones del modelo de vista.
  • Su modelo de vista de shell probablemente debería implementar un tipo Screen o Conductor (en lugar de PropertyChangedBase) si va a tener un ciclo de vida (activación/desactivación, etc.), o va a tener un elemento actualmente activo (pantalla) que puede cambiar a tiempo de ejecución
+0

gracias! Lo conseguí trabajando con la propiedad SelectedItem, pero no SelectedCatalogName, sin embargo, eso es solo una bonificación de todos modos ... –

+2

Ah, podría intentar nombrar el cuadro combinado CatalogNames, y luego tener una propiedad CatalogNames y SelectedCatalogName. Yo esperaría que eso funcione. – devdigital

+2

sí, eso lo hizo .. me gusta! –

Cuestiones relacionadas