我希望将String与文本框绑定。字符串不断在线程中更新:
String inputread;
public event PropertyChangedEventHandler PropertyChanged;
public string InputRead
{
get { return inputread; }
set
{
if (Equals(inputread, value) == true) return;
inputread = value;
this.OnPropertyChanged(nameof(this.inputread));
}
}
void threadFunc()
{
try
{
while (threadRunning)
{
plc.Read();
InputRead =plc.InputImage[1].ToString();
MessageBox.Show(InputRead);
}
}
catch (ThreadAbortException)
{
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
后来的Binding声明:
Binding bind = new Binding("InputRead");
bind.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(newtextbox, TextBox.TextProperty, bind);
我理解为什么这个不起作用的问题的部分(文本框是完全空的)是因为我不会在每次线程运行时刷新它。我该怎么做?另外我怀疑绑定声明存在缺陷我不确定如何。
我阅读了有关数据绑定的MSDN文章,它帮助我做到了这一点 我用谷歌搜索了这是我如何得到这一点,也是在早期的Stackoverflow的帮助下,仍然没有成功。
编辑:我编辑了一下代码,但文本框仍然是空的(甚至不是0)。我正在使用wpf!如果它更容易,有人可以指导我使用dispatcher.invoke吗?
谢谢!
答案 0 :(得分:0)
在threadFunc()
功能中,您可以将值直接设置为inputread
(小写),它是一个字段,不会调用OnPropertyChanged
。
您可以将threadFunc()
中的代码更改为InputRead=plc.InputImage[1].ToString();
我希望它适合你。
答案 1 :(得分:0)
您需要创建一个属性并将TextBox
绑定到属性
private string _Inputed;
public string Inputed
{
get { return _Inputed; }
set
{
if(Equals(_Inputed, value) == true) return;
_Inputed = value;
this.OnPropertyChanged(nameof(this.Inputed));
}
}
void threadFunc()
{
try
{
while (threadRunning)
{
plc.Read();
this.Inputed = plc.InputImage[1].ToString();
}
}
catch (ThreadAbortException)
{
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
XAML
<TextBlock Text="{Binding Path=Inputed}"/>