如何知道字符串何时更改并执行某些操作?

时间:2015-01-23 05:11:16

标签: c# .net winforms

我提前为一个菜鸟问题道歉。 我有一个在没有我控制的情况下改变的字符串(另一方的字符串)让我们称之为firstString, 每次更改此字符串时,我需要在程序中执行操作。

所以我创建了一个实现" INotifyPropertyChanged"接口, 并在其中创建了一个带有属性的字符串,让我们称之为secondString, 在表格的主要方法上,我创建了一个" PropertyChangedEventHandler"和一个事件方法,显示一个值为firstString的消息框。

如果我通过单击按钮来更改其值来手动测试和更改firstString,并且在通过secondString属性之后我得到一个带有firstString值的消息框,那么一切都运行良好,我将它设置为这样: SecondString(这是一个属性)= firstString;

但是事情是firstString本身在变化,而我无法控制它,所以如果它被代码设置为等于secondString的属性会发生什么,它只适用于第一个它运行的时间。

所以现在每当secondString的属性发生变化时,事件就会触发,那部分工作正常。 但每次firstString的值发生变化时,我都需要自动设置secondString值的secondString值。而且我觉得INotifyPropertyChanged也应该在这方面为这部分工作,但我无法理解。 所以我试图弄清楚如何" bind" string' s一个到secondString属性的值,并进入DataBinding,但是我找不到任何将两个字符串绑定在一起的例子,只是关于绑定到控件或从控件绑定。

编辑:这是一个演示代码,我认为我错过的关键是firstString是我在另一方的类库中得到的字符串。

Using AnotherPartyLibrary;

FirstClass fc;          

 public Form1()
        {
            InitializeComponent();

            fc = new FirstClass();
            fc.PropertyChanged += new PropertyChangedEventHandler(fc_PropertyChanged);

            fc.SecondString = AnotherPartyLibrary.firstString;

            this.Disposed += new EventHandler(Form1_Disposed);
        }

     void fc_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
           MessageBox.Show("Something changed!" + e.PropertyName);
        }

    public class firstClass :INotifyPropertyChanged
    {
        private string secondString = string.Empty;

        public string SecondString
        {
            get { return this.secondString; }
            set
            {
                this.secondString = value;
                NotifyPropertyChanged("SecondString");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }

这个问题通常如何解决?提前谢谢了!

编辑:除了a.azemia提供的解决方案之外,还有人可以提供其他解决方案吗?再次感谢!

雷。

1 个答案:

答案 0 :(得分:4)

基于您无法控制firstString的假设,您可以使用BackgroundWorker监视firstString值并更新SecondString

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += (s, e) =>
            {
                while (true)
                {
                    if (!fc.SecondString.Equals(AnotherPartyLibrary.firstString))
                    {
                        fc.SecondString = AnotherPartyLibrary.firstString;
                    }
                    Thread.Sleep(1000);
                }
            };
        bw.RunWorkerAsync();

您还可以使用Microsoft TPL获得相同的结果

public async void YourMethodName() 
{
    await Task.Run(() => 
        {
                while (true)
                {
                    if (!fc.SecondString.Equals(AnotherPartyLibrary.firstString))
                    {
                        fc.SecondString = AnotherPartyLibrary.firstString;
                    }
                    Thread.Sleep(1000);
                }
        });
}

但是,如果你可以更新firstString的代码,那么你应该在firstString上实现INotifyPropertyChanged