2010-09-06 15 views
11

Estoy intentando crear algo así como una interfaz con pestañas MDI, así que tengo un panel de navegación (un Listbox) a la izquierda y un ContentPresenter a la derecha.Enlazar un comando a un botón dentro de un ListView con Caliburn.Micro

Tengo un ShellViewModel que tiene un BindableCollection en él llama AvailAbleScreens y gestionado con éxito para unirse a esa lista con un listviews DataTemplate:

<ListView x:Name="AvailableScreens"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <WrapPanel> 
       <BulletDecorator /> 
       <Button x:Name="DisplayView"> 
        <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> 
       </Button> 
      </WrapPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 

El problema ahora es que aunque el nombre del botón se establece correctamente, no puedo hacer que el Comando se dispare por mí. En la clase MdiViewModel Tengo el siguiente código para ese botón:

public bool CanDisplayView() 
{ 
    return true; 
} 

public void DisplayView() 
{ 
    MessageBox.Show("Hello"); 
} 

Todas las muestras Caliburn.Micro trabajan con la unión a través de convenciones a la x: Nombre de la propiedad, pero si me quitan el texto = "{Binding} "¿deja de funcionar, así que sospecho que esta forma de enlace de datos no funciona para los submodelos?

De todos modos, modelo de vista de la Shell es bastante simple en la actualidad

ShellViewModel 
* AvailableScreens 
    -MdiViewModel1 
    -MdiViewModel2 
* CurrentActiveScreen 

alguna idea de lo que me gustaría hacer esto con Caliburn.Micro? Rob Eisenberg me sugirió en Twitter que podría comenzar con Caliburn.Micro antes de entrar en el marco completo de Caliburn.

Respuesta

19

Lamentablemente, no podemos aplicar convenciones de forma automática al contenido de DataTemplates. La razón de esto es que no tenemos forma de interceptar el mecanismo de creación de plantillas de WPF/Silverlight. Para evitar esto, tiene un par de opciones:

  1. No utilice las convenciones dentro de DataTemplates; Utilice enlaces explícitos y Message.Attach en su lugar

  2. Extraiga todas las plantillas de datos en UserControls, que volverán a establecer las convenciones en UserControl. Esta es una buena idea para las plantillas grandes, pero tediosa para los más pequeños

  3. Utilice la propiedad adjunta Bind.Model en la raíz de la UIElement DataTemplate como esto Bind.Model="{Binding}". Hacer esto provocará que las convenciones se vinculen a DataTemplate. Desafortunadamente, esto puede no funcionar bien debido a algunos errores en Caliburn. Funciona en Caliburn.Micro embargo. Espero trabajar ese error pronto.

Cuestiones relacionadas