2016-07-04 12 views
1

Stringをテキストボックスにバインドできません。 これは簡単な質問であると確信しています、私はそれをたくさんGoogle、まだそれは私のために働いていない。私はいくつかのソリューションを試してみました。文字列に常に更新された文字列をバインドする

私は常に私は、プログラムが開始されたときcraetedますテキストボックス(newtextbox)にこの文字列を結合しないか、スレッド

_inputread = plc.input[1]; 

に更新され、その値を取得した文字列(inputread)を持っていますか?

後で
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

値が変更されたときには 'textbox.Text = yourvalue'ですか? – Furtiro

+0

どうすればよいですか?値が_inputreadに赤色の場合は、イベントを呼び出す必要がありますか?また、テキストボックスをやり直す必要があります。 text = yourvalue? – zadrian

+0

あなたのコードはちょっと混乱します。あなたはバックインフィールド '_inputread'を使用しています。プロパティは決して使用されないので、' OnPropertyChanged'を起動しません。 – lokusking

答えて

1

あなたはバインディングのパワーを過大評価しているようです。この部分

string _inputRead; 
public string InputRead // fixing naming 
{ 
    get { return _inputRead; } 
    set 
    { 
     _inputRead = plc.InputImage[1].ToString(); 
     OnPropertyChanged("inputread"); 
    } 
} 

あなたが直接InputReadを変更したときにのみ通知を上昇する、例えばそれを設定することにより:

InputRead = "someNewValue"; 

をおそらくあなたは

public string InputRead => plc.InputImage[1].ToString(); 

代わりに、単純なゲッターのみのプロパティをしたいが、あなたは、通知に plc.InputImageがMVVMについて話す

// assuming it's another thread, call this when you want view to update the value 
Dispatcher.Invoke(() => OnPropertyChanged(nameof(InputRead))); 

を変更するたびに上昇していplc.InputImageが変更されたときに、モデルが通知を受け取る必要があります。イベントInputImageChanged。 ViewModelはそれを購読し、行の上にあるイベントハンドラコールに登録します。このよう

public string InputRead => plc.InputImage[1].ToString(); 

void ThreadFunc() 
{ 
    while (threadRunning) 
    { 
     plc.Read(); 
     Dispatcher.Invoke(() => OnPropertyChanged(nameof(InputRead))); 
    } 
} 
+0

答えにコメントしなければならなかった、私はこの小さなスペースを編集できません。 – zadrian

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 '

+0

'inputread = plc ......'行を完全に削除してください。 Getter-onlyプロパティは既にそれを行います(値を取得します)。必要なのは、 "値が変更されました、更新してください"(これは 'OnPropertyChanged'を呼び出すことによって行われます)のビューに、プロパティの値を取得する(' InputImage'の更新された値を返します)将来的には、次回に別の質問をすることを検討してください。 – Sinatr

+0

私の答えに編集を参照してください。 – Sinatr

+0

"引数1:" string "から" System.Windows.DependencyPropertyChangedEventArgs "への" nameof(InputRead) "への変換ができません。 – zadrian

関連する問題