将不断更新的字符串绑定到文本框

时间:2016-07-04 08:38:00

标签: c# wpf data-binding textbox

我无法将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);

谢谢!

2 个答案:

答案 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'