Saltar al contenido principal

 none
acceder a los elementos de un formulario xaml desde otra clase RRS feed

  • Pregunta

  • Hola! soy nueva en esto de WPF, asi que seguramente mi duda tendra una respuesta sencilla, pero he estado buscando por el foro y en google y no encuentro nada concreto que me haya servico de ayuda.

    Mi problema es que yo tengo un proyecto con un formulario WPF:

    Page1.xaml

    <Page x:Class="WpfBrowserApplication1.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1">
        <Grid Height="440" Width="658">
            <ListView Margin="10,18,8,148.616" Name="listView1" IsSynchronizedWithCurrentItem="True" />
            <Button Height="32" HorizontalAlignment="Left" Margin="14,0,0,110" Name="button1" VerticalAlignment="Bottom" Width="111" Click="button1_Click">Primera Carga</Button>
            <Label Height="29" Margin="100,0,10,48" Name="label1" VerticalAlignment="Bottom">Label</Label>
        </Grid>
    </Page>

    Y basicamente lo que necesito es poder acceder a los elementos del formulario, como por ejemplo el listView1 desde una clase que no sea la del formulario, en mi caso esta clase esta en el mismo proyecto, en el archivo Page1.xaml.cs:

    namespace WpfBrowserApplication1
    {
        /// <summary>
        /// Interaction logic for Page1.xaml
        /// </summary>  
       
        public partial class Page1 : Page
        {
            
            public Page1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                label1.Content += "He pulsado en el boton";
                InstanceContext instanceContext = new InstanceContext(new CallbackHandler());            
                ServiceDuplexClient client = new ServiceDuplexClient(instanceContext);  
                client.subscripcion();          
            }
                   
        }

        public class CallbackHandler : IServiceDuplexCallback
        {
            public void Enviar(Dictionary c)

            {

              //En esta clase es en la que necesito acceder a los controles del formulario y que no puedo porque no tengo "visible" el control

             //listView1.ItemsSource = c;

            }
        }

    }

    Investigando un poco por los foros y google, he visto que te dicen que hay que exponer los elementos del formulario como publicos, ya que por defecto XAML los crea como privados y que por eso no puedo acceder, pero no se exactamente como ponerlos como publicos, ya que buscando entre las propiedades de los elementos no hay nada parecido.

    Necesito acceder desde la clase CallBackHandler porque el formulario es el cliente de un servicio WCF Duplex, por lo que cuando el servicio tiene que enviar datos al cliente lo hace ejecutando la funcion Enviar, por lo que no me queda otra que acceder a los controles del formulario desde esta funcion Enviar.

    Espero que alguien mepueda echar una mano, ya que a simple vista parece que es algo sencillo, seguro que se me esta escapando algo.

    Un saludo y gracias

    miércoles, 18 de julio de 2012 7:31

Respuestas

  • Hola!! ya me han comentado como conseguirlo, y es que tengo que crear una clase estatica con un atributo publico que va a guardar la referencia al formulario, y ya a traves de ese atributo puedo acceder a los elementos del formulario:

    namespace WpfBrowserApplication1
    {
        /// <summary>
        /// Interaction logic for Page1.xaml
        /// </summary>


        public partial class Page1 : Page
        {
            
            public Page1()
            {
                InitializeComponent();
                UIGlobal.MainPage = this;
            }

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                label1.Content += "He pulsado en el boton";
                InstanceContext instanceContext = new InstanceContext(new CallbackHandler());

                ServiceDuplexClient client = new ServiceDuplexClient(instanceContext);
                client.subscripcion();
            }   
        }

        public class CallbackHandler : IServiceDuplexCallback
        {
            public void Enviar(Dictionary c)
            {
                UIGlobal.MainPage.listView1.ItemsSource = null;
                UIGlobal.MainPage.listView1.ItemsSource = c;
            }
        }

        public static class UIGlobal
        {
            public static Page1 MainPage { get; set; }
        }

    }

    y ya puedo acceder a todos los elementos del formulario a traves de UIGlobal.MainPage que es una referencia al formulario y que se inicializa cuando inicializamos el formulario

    Espero que sirva de ayuda

    • Marcado como respuesta RocioQR miércoles, 18 de julio de 2012 9:49
    miércoles, 18 de julio de 2012 9:43