2016-07-05 2 views
0

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

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); 

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

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

EDIT: Я немного изменил код, но текстовое поле пусто (даже не 0). Я использую wpf! Если это проще, может ли кто-нибудь помочь мне использовать диспетчер.

Спасибо!

+0

Что рамки пользовательского интерфейса вы используете? 'Winforms',' WPF' – Fabio

+0

wpf, извините за то, что не сказал, что – zadrian

+0

_может ли кто-нибудь помочь мне использовать dispatcher.invoke_ Wpf является безопасным с перекрестными потоками. Поднятое событие 'PropertyChanged' будет перенаправлено обратно в поток пользовательского интерфейса. – Fabio

ответ

0

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

+0

Я думаю, что нашел проблему. Возможно, вы забыли установить DataContext. Вы привязываетесь к «InputRead», но вы не говорите компилятору, где находится «InputRead». Таким образом, добавление этой строки в объявление привязки может помочь. DataContext = new <Ваш класс содержит InputRead>(); – tandat

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}"/> 
+0

Спасибо! Как связать текстовое поле с этим свойством? Неужели мое решение не так хорошо? Я отредактирую исходный вопрос, чтобы показать, где я нахожусь. – zadrian

Смежные вопросы