C# 仅显示信息/更新主gui的最佳方式

C# 仅显示信息/更新主gui的最佳方式,c#,class,main,solid-principles,C#,Class,Main,Solid Principles,首先,这可能是一个愚蠢的问题,但无论如何,这不是一个问题,基本上我正在寻找一种最好的方式,将一个类的结果显示到主窗口。 现在我会告诉你我需要什么,然后我会如何用我现有的知识解决这个问题,知道这是不正确的方式 因此,单击按钮,我可以执行以下操作: private void btnSend_Click(object sender, RoutedEventArgs e) { new Notification().DoNotify(txtMessage.Tex

首先,这可能是一个愚蠢的问题,但无论如何,这不是一个问题,基本上我正在寻找一种最好的方式,将一个类的结果显示到主窗口。 现在我会告诉你我需要什么,然后我会如何用我现有的知识解决这个问题,知道这是不正确的方式


因此,单击按钮,我可以执行以下操作:

private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            new Notification().DoNotify(txtMessage.Text);
        }

类别定义如下:

public class Notification
    {
        private IMessenger _iMessenger;
        public Notification()
        {
            _iMessenger = new Email();
        }
        public void DoNotify(string Message)
        {
            _iMessenger.SendMessage(Message);
        }
    }

interface IMessenger
    {
        void SendMessage(string Message);
    }

public class SMS : IMessenger
    {
        public void SendMessage(string Message)
        {
            // i want code that will print this message variable to the txtSMS textbox.
        }
    }

    public class Email : IMessenger
    {
        public void SendMessage(string Message)
        {
            // i want code that will print this message variable to the txtEmail textbox.
        }
    }
现在,如何从这些类更新主窗口GUI

我会使用的一个解决方案是,添加新的tempclass,其中包含mainwindow对象,然后访问它

public class TempClass
    {
        public static MainWindow Main;
    }
在主窗口构造函数中:

public MainWindow()
        {
            InitializeComponent();
            TempClass.Main = this;
        }
以及sms/电子邮件类:

public class Email : IMessenger
    {
        public void SendMessage(string Message)
        {
            TempClass.Main.txtEmail.Text = Message;
        }
    }

    public class SMS : IMessenger
    {
        public void SendMessage(string Message)
        {
            TempClass.Main.txtSMS.Text = Message;
        }
    }
现在这是可行的,但必须有更好的方法。。。你觉得怎么样?很抱歉发了这么长的帖子…://
这方面有什么原则或设计模式吗?

当您可能有两个或多个应用程序实例时,不建议使用静态属性。您可以在主窗口中定义一个方法:

internal void SetMessage(string Message)
{
     Dispatcher.BeginInvoke(new Action(() => {txtSMS.Text = Message;}));
}
并将MainWindow的实例发送到其他类,无论是通过特定的构造函数

MainWindow parentWindow;
void btnSend_Click(object sender, RoutedEventArgs e)
{
      if (parentWindow != null)
          _parentWindow.SetMessage(txtMessage.Text);
}
或者通过定义DependencyProperty并使用绑定


您也可以使用事件,但是,我更喜欢前面的方法。

我同意,我实际上在这类情况下使用了事件,但我忘了提到,好的,还有比事件更好的方法吗?不需要事件和由此产生的强绑定-Windows窗体和WPF都提供数据绑定。通过实现INotifyPropertyChanged接口,您可以通知订阅者(UI)发生了更改,但不需要为每种数据使用单独的事件。数据绑定机制将负责刷新UI@ShadyOverflowWPF还是Winforms?WPF有多个MVVM框架,它们已经实现了您所需要的功能。有些,如Caliburn.Micro,甚至使用约定自动将
消息
列表框绑定到ViewModelPanagiotis上的
消息
列表属性:对于您的需求,数据绑定甚至比事件更合适。