Привязка постоянно обновляемой строки с текстовым полем

Я хочу связать строку с текстовым полем. Строка постоянно обновляется в потоке:

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 bind = new Binding("InputRead");
bind.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(newtextbox, TextBox.TextProperty, bind);

Я понимаю, что часть проблемы, почему это не работает (текстовое поле полностью пусто), заключается в том, что я не обновляю его каждый раз, когда запускается поток. Как мне это сделать? Также я подозреваю, что Декларация обязательна, я не знаю как.

Я прочитал статью MSDN о привязке данных, она помогла мне зайти так далеко.
Я прогуглил это, вот как я дошел до этого, также с помощью Stackoverflow ранее, все еще безуспешно.

РЕДАКТИРОВАТЬ: Я немного отредактировал код, но текстовое поле все еще пустое (даже 0). Я использую wpf! Если это проще, может ли кто-нибудь подсказать мне использовать dispatcher.invoke?

Спасибо!

 zadrian05 июл. 2016 г., 10:39
wpf, извините, что не сказал, что
 Fabio05 июл. 2016 г., 10:50
кто-то может направить меня использовать dispatcher.invoke Wpf безопасен для многопоточности. поднятыйPropertyChanged событие будет перенаправлено обратно в поток пользовательского интерфейса.
 Fabio05 июл. 2016 г., 10:32
Какую платформу пользовательского интерфейса вы используете?Winforms, WPF

Ответы на вопрос(2)

Вам нужно создать свойство и связать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}"/>
 zadrian05 июл. 2016 г., 10:31
Спасибо! Как привязать текстовое поле к свойству? Мое решение не хорошо? Я отредактирую оригинальный вопрос, чтобы показать, где я нахожусь.

threadFunc() функция, вы устанавливаете значение непосредственноinputread (нижний регистр), это поле и нет вызоваOnPropertyChanged, ы можете изменить код вthreadFunc() вInputRead=plc.InputImage[1].ToString(); Я надеюсь, что это работает для вас.

 tandat05 июл. 2016 г., 16:17
Я думаю, что нашел проблему. Может быть, вы забыли установить DataContext. Вы связываетесь с InputRead, но не указываете компилятору, где находится InputRead. Таким образом, добавить эту строку в обязательном объявлении может помочь. DataContext = new <Ваш класс содержит InputRead> ();

Ваш ответ на вопрос