如何知道字符串何时更改并执行某些操作?
How to know when a string changed and do something?
对于菜鸟问题,我提前表示歉意。
我有一个字符串在不受我控制的情况下发生变化(另一方的字符串)让我们称之为 firstString,
每次此字符串更改时,我都需要在我的程序中执行一个操作。
所以我做了一个 class 实现了 "INotifyPropertyChanged" 接口,
并在其中创建了一个带有 属性 的字符串,我们称它为 secondString,
在表单的主要方法上,我创建了一个 "PropertyChangedEventHandler" 和一个显示值为 firstString.
的消息框的事件方法
如果我通过单击按钮更改其值来手动测试和更改 firstString 并且在它通过 secondString 的 属性 后得到一个消息框,其中包含 firstString 的值,则一切正常,我将其设置如下:
SecondString
(这是一个属性)= firstString;
但问题是 firstString 正在自行改变,我无法控制它,所以如果代码将它设置为等于 secondString 的 属性 会发生什么情况是它只适用于第一个它运行的时间。
所以现在每次 secondString 的 属性 发生变化时,事件都会触发并且该部分工作正常。
但每次 firstString 的值发生变化时,我都需要自动将 secondString 的值设置为 firstString 的值。我有点认为 INotify属性Changed 也应该以某种方式在这部分工作,但我不明白是如何工作的。
所以我试图弄清楚我们如何将 "bind" 字符串的 A 值转换为 secondString 的 属性,并进入数据绑定,但我找不到任何将两个字符串绑定在一起的示例,只是关于绑定到或从一个控件。
编辑: 这是一个演示代码,我认为我没有注意到的关键是 firstString 是我从另一方 class图书馆。
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 的假设,那么您可以使用 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, 每次此字符串更改时,我都需要在我的程序中执行一个操作。
所以我做了一个 class 实现了 "INotifyPropertyChanged" 接口, 并在其中创建了一个带有 属性 的字符串,我们称它为 secondString, 在表单的主要方法上,我创建了一个 "PropertyChangedEventHandler" 和一个显示值为 firstString.
的消息框的事件方法如果我通过单击按钮更改其值来手动测试和更改 firstString 并且在它通过 secondString 的 属性 后得到一个消息框,其中包含 firstString 的值,则一切正常,我将其设置如下:
SecondString
(这是一个属性)= firstString;
但问题是 firstString 正在自行改变,我无法控制它,所以如果代码将它设置为等于 secondString 的 属性 会发生什么情况是它只适用于第一个它运行的时间。
所以现在每次 secondString 的 属性 发生变化时,事件都会触发并且该部分工作正常。 但每次 firstString 的值发生变化时,我都需要自动将 secondString 的值设置为 firstString 的值。我有点认为 INotify属性Changed 也应该以某种方式在这部分工作,但我不明白是如何工作的。 所以我试图弄清楚我们如何将 "bind" 字符串的 A 值转换为 secondString 的 属性,并进入数据绑定,但我找不到任何将两个字符串绑定在一起的示例,只是关于绑定到或从一个控件。
编辑: 这是一个演示代码,我认为我没有注意到的关键是 firstString 是我从另一方 class图书馆。
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 的假设,那么您可以使用 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
。