none
Como envío un string desde un ArrayList o una clase, a un ItemsSource del panel auxiliar de un Ribbon, al estilo Recent Documents de Office RRS feed

  • Pregunta

  • Hola

    Quiero implementar una lista de archivos recientes en una aplicación con un control Ribbon (Recent Documents) al estilo Office.

    La lista de archivos la tengo en un ArrayList, como hago para vincular esa lista en la propiedad ItemsSource del panel auxiliar del Ribbon, como hace el siguiente código de ejemplo que hace un binding a "RecentFiles" (en dicho ejemplo no estaba el codebehind de como genera el RecentFiles):

    r:Ribbon.ApplicationMenu>
        <r:RibbonApplicationMenu>
            <r:RibbonApplicationMenu.AuxiliaryPaneContent>
                <StackPanel>
                    <TextBlock Text="Recent Files" />
                    <Separator />
                    <ItemsControl ItemsSource="{Binding RecentFiles}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <r:RibbonApplicationMenuItem Header="{Binding ShortPath}" 
                                                             Command="{Binding DataContext.OpenRecentFileCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                                             CommandParameter="{Binding LongPath}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </r:RibbonApplicationMenu.AuxiliaryPaneContent>
        </r:RibbonApplicationMenu>                
    </r:Ribbon.ApplicationMenu>

    Busque varios ejemplos y los que hay utilizan librerías y acceso el registro de windows para generar y persistir la lista, pero quiero algo más simple y claro. Y los ejemplos que "agregan" la lista de archivos lo hacen agregando un MenuItem en tiempo de ejecución al menu en sí, no lo hacen sobre el panel auxiliar.

    Desde ya muchas gracias.

    Saludos.

    Jorge


    Jorge Lorenzo Developer Freelance .NET


    viernes, 2 de marzo de 2012 18:30

Todas las respuestas

  • Hola Jorge.

    ¿que tipo de objeto es RecentFiles, que contiene?.

    Si esta enlazado y creado el objeto correctamente, deberia de funcionar, lo que puedes hacer es depurar el enlace mediante un conversor, te creas un conversor y le pones un punto de interrupcion, para ver que objeto le esta llegando.

    no tengo ningun ejemplo a mano ya que no es dificil implementarlo, te paso un link donde se explica bastante bien como hacerlo.

    http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx

    Si tienes algun problema comentalo.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    martes, 13 de marzo de 2012 13:38
  • Hola David

    Cree una clase llamada ArchivoReciente:

    Public Class ArchivoReciente
    
        Private _archivoNombre As String
    
        Public Property ArchivoNombre As String
            Get
               Return _archivoNombre
            End Get
            Set(ByVal value As String)
               _archivoNombre = value
            End Set
        End Property
    
    End Class

    Dentro del Window principal tengo dos declaraciones:

    Dim _listaDeArchivos As New List(Of ArchivoReciente)
    Dim _archivoReciente As New ArchivoReciente

    Y cada vez que abro un archivo lo agrego de la siguiente manera:

    _archivoReciente.ArchivoNombre = _stringRutaCompleta
    _listaDeArchivos.Add(_archivoReciente)

    Y luego de hacer esto actualizo el DataContext del Ribbon:

    Me.Ribbon.DataContext = _listaDeArchivos

    El Binding lo tengo establecido de esta manera:

                        <my:RibbonApplicationMenu.AuxiliaryPaneContent>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="20" />
                                    <RowDefinition Height="5" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <my:RibbonSeparator Grid.Row="0" Label="Recent Documents"/>
                                <ItemsControl Name="recentDocuments" Grid.Row="2" ItemsSource="{Binding}">
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <my:RibbonButton Command="{Binding Path=Command}"
                                                             CommandParameter="{Binding Path=ToolTipDescription}"
                                                             Label="{Binding ArchivoNombre}"
                                                             ToolTip="Click to open file..."/>
    
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </Grid>
                        </my:RibbonApplicationMenu.AuxiliaryPaneContent>

    Así como esta funciona, pero solo me muestra un archivo, por mas de que abra 3 o 4:


    No se donde está el problema.

    Gracias.

    Jorge


    Jorge Lorenzo Developer Freelance .NET

    jueves, 15 de marzo de 2012 19:11
  • Hola Jorge.

    En lugar de un objeto List, deberias usar un ObservableCollection para la lista de archivos, esta coleccion actualiza el enlace cada vez que se añade o elimina algun elemento de ella automaticamente. De este modo te evitas actualizar el datacontext del ribbon, ya que es posible que no se este enlazando los nuevos contextos.

    Pruebalo y cuentas que tal.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    jueves, 29 de marzo de 2012 11:07