【问题标题】:How to know when a string changed and do something?如何知道字符串何时更改并执行某些操作?
【发布时间】:2015-01-23 05:11:16
【问题描述】:

对于一个菜鸟问题,我提前道歉。 我有一个字符串在不受我控制的情况下发生变化(另一方的字符串)让我们称之为 firstString, 每次这个字符串发生变化时,我都需要在我的程序中执行一个操作。

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

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

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

所以现在每次 secondString 的属性发生变化时,都会触发事件并且该部分工作正常。 但是每次 firstString 的值发生变化时,我都需要使用 firstString 的值自动设置 secondString 的值。我有点想 INotifyPropertyChanged 也应该在这里以某种方式在这部分工作,但我不明白如何。 所以我试图弄清楚我们如何将字符串的 A 值“绑定”到 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 提供的解决方案之外,任何人都可以提供其他解决方案吗?再次感谢!

雷。

【问题讨论】:

  • 如果你能发布一些代码,它会有所帮助..
  • 你能提供你正在做什么的示例源代码吗?
  • firstString 是如何更新的?这发生在哪里,你如何获得它的价值?发生这种情况时,您需要致电通知,但如果不了解更多详细信息,很难确切地告诉您如何操作。请提供一个简单的示例,说明您正在做什么以及您希望发生什么。
  • 我了解您希望在firstString 更改时收到通知。那么你为什么要在secondString 上实现INotifyPropertyChanged 事件?你应该在firstString 上实现INotifyPropertyChanged,然后你应该在事件中做任何你想做的事情。您已经写过要在firstString 更改时执行操作。我正在基于此撰写此评论。贴一些示例代码。
  • 第一个字符串是否存在于控件中?和编辑字段?当字符串更改时,该控件是否更新?

标签: c# .net winforms


【解决方案1】:

基于您无法控制 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 的代码或进入 firstString 的类。我只能按原样得到。这个字符串有时会每秒更新几次,所以我认为它不会“Thread.Sleep”整整一秒钟,除了我不确定 BackgroundWorker 将如何工作,我想我需要测试它,我不确定,但使用 BackgroundWorker 是不是有点“资源繁重”?再次感谢。我想知道是否还有其他更指定的解决方案。
  • 在您的情况下,资源使用情况不会很明显。如果需要,您还可以增加线程休眠的时间。
  • 谢谢,我根本睡不着,我需要知道每秒firstString的值..
  • 感谢@a.azemia!你的解决方案对我有用。我唯一担心的是是否有更指定的方式来完成相同的任务(如果没有,我会将您的答案标记为答案)以及您的解决方案是否真的不像您所说的那样占用大量资源。再次感谢!
  • @Ray。如果您找到更指定的方法来完成此操作,请分享。您还可以使用 .NET4 中引入的 Phillip 评论的 TPL,其中还涉及运行异步操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2018-12-19
  • 1970-01-01
  • 2015-11-14
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多