none
Notificações entre janelas RRS feed

  • Pergunta

  • Bom dia,

    uma ajuda por favor.

    Atualmente quando eu preciso que uma janela passe informações para outra, eu executo o método ShowDialog e com isso consigo interagir com as propriedades.

    Existe algum outro método de uma janela notificar a outra durante uma pesquisa, por exemplo, uma janela chama outra onde aparece uma lista de produtos e ao clicar no produto desejado a janela de destino notifica a de origem.

    Isso existe no Xamarin Forms (MessengerCenter)

    Obrigado


    Ricardo S. Pulini

    terça-feira, 26 de fevereiro de 2019 12:12

Respostas

  • Bom dia Ricardo,

    Tudo certo?

    Para começarmos, por favor, nos informe qual a linguagem que está utilizando? C# ou VB.NET?

    Existem varias maneiras de fazer isso. Uma que eu utilizaria, seria o padrão Singleton. Uma classe estática, com uma propriedade estática. Essa propriedade seria de um tipo de classe contendo propriedades que possam ser linkadas com DataBinding por qualquer janela e também poderiam ser atualizadas de qualquer parte do código.

    Vou deixar um exemplo de uma Classe Singleton de fácil implementação:

        public class Classe_Singleton : NotifyPropertyChanged
        {
            #region Singleton
            private static Classe_Singleton _Singleton;
            public static Classe_Singleton Singleton
            {
                get
                {
                    if (_Singleton == null) _Singleton = new Classe_Singleton();
                    return _Singleton;
                }
            }
            private string _Propriedade;
            public string Propriedade
            {
                get
                {
                    return _Propriedade;
                }
                set
                {
                    _Propriedade = value;
                    OnPropertyChanged("Propriedade");
                    OnFazerAlgumaCoisa();
                }
            }
            public event EventHandler FazerAlgumaCoisa;
            protected virtual void OnFazerAlgumaCoisa()
            {
                FazerAlgumaCoisa?.Invoke(this, new EventArgs());
            }
            #endregion
    
        }
        public class NotifyPropertyChanged : System.ComponentModel.INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string PropertyName)
            {
                if (!string.IsNullOrWhiteSpace(PropertyName))
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
            }
        }


    A propriedade chamada "Propriedade" pode ser facilmente linkada em com DataBinding no XAML em qualquer janela ou controle da sua aplicação, para monitorar. Se alguma parte do código alterar o valor da propriedade, o Controle ou Janela linkado responderá imediatamente. Você ainda tem a possibilidade de criar eventos, nos quais você pode acompanhar mudanças no code behind da sua aplicação.

    Esse padrão Singleton que estou te apresentando é válido no Xamarin também! É muito utilizado em conjunto com o padrão MVVM.

    Abaixo, uma maneira de você acompanhar mudanças na propriedade via código, usando o evento implementado na classe:

    namespace WpfApp_Csharp
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                Classe_Singleton.Singleton.FazerAlgumaCoisa += (object sender, EventArgs e) => 
                {
                    ///Código aqui quando a propriedade for alterada.
                };
            }
        }
    }


    Não é algo complexo, mas é um dos padrões mais utilizados na programação. Definitivamente, muito útil. Vou deixar alguns links de apoio para você dar uma lida e entender melhor a ideia em si:

    MVVM STARTER PACK – INICIANDO NO MVVM – C#

    Singleton - Padrão de Projeto com Microsoft .NET C Sharp

    Implementando as Interfaces de Notificação de Alteração no WPF

    Espero ter lhe ajudado. Abraço!


    Herbert Lausmann

    • Marcado como Resposta Ricardo Pulini terça-feira, 26 de fevereiro de 2019 17:48
    terça-feira, 26 de fevereiro de 2019 13:57

Todas as Respostas

  • Bom dia Ricardo,

    Tudo certo?

    Para começarmos, por favor, nos informe qual a linguagem que está utilizando? C# ou VB.NET?

    Existem varias maneiras de fazer isso. Uma que eu utilizaria, seria o padrão Singleton. Uma classe estática, com uma propriedade estática. Essa propriedade seria de um tipo de classe contendo propriedades que possam ser linkadas com DataBinding por qualquer janela e também poderiam ser atualizadas de qualquer parte do código.

    Vou deixar um exemplo de uma Classe Singleton de fácil implementação:

        public class Classe_Singleton : NotifyPropertyChanged
        {
            #region Singleton
            private static Classe_Singleton _Singleton;
            public static Classe_Singleton Singleton
            {
                get
                {
                    if (_Singleton == null) _Singleton = new Classe_Singleton();
                    return _Singleton;
                }
            }
            private string _Propriedade;
            public string Propriedade
            {
                get
                {
                    return _Propriedade;
                }
                set
                {
                    _Propriedade = value;
                    OnPropertyChanged("Propriedade");
                    OnFazerAlgumaCoisa();
                }
            }
            public event EventHandler FazerAlgumaCoisa;
            protected virtual void OnFazerAlgumaCoisa()
            {
                FazerAlgumaCoisa?.Invoke(this, new EventArgs());
            }
            #endregion
    
        }
        public class NotifyPropertyChanged : System.ComponentModel.INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string PropertyName)
            {
                if (!string.IsNullOrWhiteSpace(PropertyName))
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
            }
        }


    A propriedade chamada "Propriedade" pode ser facilmente linkada em com DataBinding no XAML em qualquer janela ou controle da sua aplicação, para monitorar. Se alguma parte do código alterar o valor da propriedade, o Controle ou Janela linkado responderá imediatamente. Você ainda tem a possibilidade de criar eventos, nos quais você pode acompanhar mudanças no code behind da sua aplicação.

    Esse padrão Singleton que estou te apresentando é válido no Xamarin também! É muito utilizado em conjunto com o padrão MVVM.

    Abaixo, uma maneira de você acompanhar mudanças na propriedade via código, usando o evento implementado na classe:

    namespace WpfApp_Csharp
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                Classe_Singleton.Singleton.FazerAlgumaCoisa += (object sender, EventArgs e) => 
                {
                    ///Código aqui quando a propriedade for alterada.
                };
            }
        }
    }


    Não é algo complexo, mas é um dos padrões mais utilizados na programação. Definitivamente, muito útil. Vou deixar alguns links de apoio para você dar uma lida e entender melhor a ideia em si:

    MVVM STARTER PACK – INICIANDO NO MVVM – C#

    Singleton - Padrão de Projeto com Microsoft .NET C Sharp

    Implementando as Interfaces de Notificação de Alteração no WPF

    Espero ter lhe ajudado. Abraço!


    Herbert Lausmann

    • Marcado como Resposta Ricardo Pulini terça-feira, 26 de fevereiro de 2019 17:48
    terça-feira, 26 de fevereiro de 2019 13:57
  • Muito obrigado Caro Herbert, ajudou muito.

    Ricardo S. Pulini

    terça-feira, 26 de fevereiro de 2019 17:48