Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道字符串何时更改并执行某些操作?_C#_.net_Winforms - Fatal编程技术网

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

C# 如何知道字符串何时更改并执行某些操作?,c#,.net,winforms,C#,.net,Winforms,我为一个noob问题提前道歉。 我有一个不受我控制的字符串(另一方的字符串)我们称它为firstString, 每次字符串更改时,我都需要在程序中执行一个操作 所以我创建了一个实现“INotifyPropertyChanged”接口的类, 并在其中创建了一个带有属性的字符串,我们称之为secondString, 在表单的main方法上,我创建了一个“PropertyChangedEventHandler”和一个事件方法,它显示了一个值为firstString的消息框 如果我通过单击按钮更改fir

我为一个noob问题提前道歉。 我有一个不受我控制的字符串(另一方的字符串)我们称它为firstString, 每次字符串更改时,我都需要在程序中执行一个操作

所以我创建了一个实现“INotifyPropertyChanged”接口的类, 并在其中创建了一个带有属性的字符串,我们称之为secondString, 在表单的main方法上,我创建了一个“PropertyChangedEventHandler”和一个事件方法,它显示了一个值为firstString的消息框

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

但问题是firstString本身正在改变,我无法控制它,所以如果代码将它设置为等于secondString的属性,那么它只在第一次运行时起作用

现在,每当secondString的属性发生更改时,就会触发事件,并且该部分工作正常。 但我需要在每次第一个字符串的值更改时自动将第二个字符串的值设置为第一个字符串的值。我觉得INotifyPropertyChanged在这里也应该对这部分起作用,但我不明白怎么做。 因此,我试图找出如何将字符串的A值“绑定”到secondString的属性,并开始进行数据绑定,但我找不到任何将两个字符串绑定在一起的示例,只是关于绑定到控件或从控件绑定

编辑:这里有一段代码要演示,我想我没有注意到的关键是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));
            }
        }
    }
这个问题通常是如何解决的?非常感谢

编辑:除了azemia提供的解决方案之外,还有谁能提供其他解决方案吗?再次感谢


假设您无法控制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

基于您无法控制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

如果您可以发布一些代码,这会有所帮助。您可以提供您正在做的工作的示例源代码吗?firstString是如何更新的?这是在哪里发生的,你是如何得到它的价值的?发生这种情况时,您需要致电Notify,但如果不知道更多细节,很难就具体如何通知您。请包括一个简单的例子,说明您正在做什么和您想发生什么。我理解,当
firstString
更改时,您希望得到通知。那么,为什么要在
secondString
上实现
INotifyPropertyChanged
事件呢?您应该在
firstString
上实现
INotifyPropertyChanged
,然后您应该在事件中做任何您想做的事情。您已经编写了当
firstString
更改时要执行的操作。我写这篇评论就是基于这个。发布一些示例代码。第一个字符串是否存在于控件中?和编辑字段?当字符串更改时,控件是否会更新?如果您可以发布一些代码,这会有所帮助。您可以提供您正在执行的操作的示例源代码吗?firstString是如何更新的?这是在哪里发生的,你是如何得到它的价值的?发生这种情况时,您需要致电Notify,但如果不知道更多细节,很难就具体如何通知您。请提供一个简单的示例,说明您正在做什么以及希望发生什么。我知道您希望在
firstString
更改时收到通知。那么,为什么要在
secondString
上实现
INotifyPropertyChanged
事件呢?您应该在
firstString
上实现
INotifyPropertyChanged
,然后您应该在事件中做任何您想做的事情。您已经编写了当
firstString
更改时要执行的操作。我写这篇评论就是基于这个。发布一些示例代码。第一个字符串是否存在于控件中?和编辑字段?当字符串更改时该控件会更新吗?谢谢,我无法更新创建firstString的代码或访问firstString的类。我只能照原样得到它。这个字符串有时会每秒更新几次,所以我不认为它可以“Thread.Sleep”一整秒钟,除了我不确定BackgroundWorker将如何工作,我认为我需要测试它,我不确定它,但使用BackgroundWorker是否有点“资源密集”?再次感谢。我想知道是否还有其他指定的解决方案。在您的情况下,资源使用将不会明显。如果需要的话,你也可以增加线程睡眠的时间。谢谢,我根本不能让它睡眠,我需要知道firstString每秒钟的值。谢谢@a.azemia!你的解决方案确实对我有用。我唯一关心的是,是否有更明确的方法来完成相同的任务(如果没有,我会将您的答案标记为答案),以及您的解决方案是否真的像您所说的那样占用大量资源。再次感谢@射线如果你找到一个更具体的方法来完成这一点,请分享。您还可以使用Phillip在.NET4中介绍的TPL,它还涉及到run