使用文本框绑定不断更新的字符串

时间:2016-07-05 07:35:34

标签: c# wpf

我希望将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吗?

谢谢!

2 个答案:

答案 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}"/>