我无法将String
绑定到文本框。
我确信这是一个简单的问题,我做了很多谷歌,但它仍然不适合我。我在网上找到了几个没有成功的解决方案。
我有一个字符串(inputread),它在一个线程中不断更新其值
_inputread = plc.input[1];
如何将此字符串绑定到一个文本框,该文本框在程序启动时被冒充(newtextbox)?
private string _inputread;
public string inputread
{
get { return _inputread; }
set
{
_inputread = plc.InputImage[1].ToString();
OnPropertyChanged("inputread");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
稍后:
Binding bind = new Binding(inputread);
bind.Source = inputread;
newtextbox.SetBinding(TextBox.TextProperty, bind);
谢谢!
答案 0 :(得分:1)
你似乎高估了绑定的力量。这部分
string _inputRead;
public string InputRead // fixing naming
{
get { return _inputRead; }
set
{
_inputRead = plc.InputImage[1].ToString();
OnPropertyChanged("inputread");
}
}
只会在您直接更改InputRead
时发出通知,例如设置它:
InputRead = "someNewValue";
可能你想要一个简单的getter-only属性而不是
public string InputRead => plc.InputImage[1].ToString();
但每次更改plc.InputImage
时都必须提高通知
// assuming it's another thread, call this when you want view to update the value
Dispatcher.Invoke(() => OnPropertyChanged(nameof(InputRead)));
谈到MVVM,您的模型必须在plc.InputImage
更改时提高通知,例如事件InputImageChanged
。 ViewModel订阅它并在行上方的事件处理程序调用中。
这是一个完整的解决方案:
public string InputRead => plc.InputImage[1].ToString();
void ThreadFunc()
{
while (threadRunning)
{
plc.Read();
Dispatcher.Invoke(() => OnPropertyChanged(nameof(InputRead)));
}
}
答案 1 :(得分:0)
public string inputread => plc.InputImage[1].ToString();
void threadFunc()
{
try
{
while (threadRunning)
{
plc.Read();
inputread = plc.InputImage[1].ToString();
Dispatcher.Invoke(() => OnPropertyChanged(nameof(inputread)));
}
}
catch (ThreadAbortException)
{
}
}
喜欢这个?如果我浪费你的时间,我很抱歉,我是c#和wpf的新手。 2个错误: error1:“inputread:属性或索引器'MainWindow.inputread'无法分配给 - 它是只读的” 错误2:“nameof(inputread)参数1:无法从'string'转换为'System.Windows.DependencyPropertyChangedEventArgs'