2017-02-12 25 views
3

ラズベリーパイで初めてのモノラルアプリケーションを実行しました。問題は、データバインディングでUIが更新されなかったことです。具体的には、私のコントローラ/モデル内のPropertyChangedイベントはnullです。つまり、加入者がいないということです。WinformsデータバインディングとINotifyPropertyChangedモノで

ビジュアルスタジオデバッガ内のウィンドウでアプリケーションを実行すると、uiが正しく更新されます。

モノラルバージョン:4.6.2 OS:Raspbian Wheezyに .NETは:4.5

私はそのシナリオにはない多くの情報を見つけました。それはWindows上で動作し、monoはINotifyPropertyChangedインタフェースをサポートしているので、linux上でモノラルでも動作すると仮定しました。

// creating the binding in code dhtControl.labelName.DataBindings.Add("Text", dht, "Name");

私はそれがデフォルトINotifyPropertyChangedの実装であるとして、必要に応じて他のコードが存在しないと思います。唯一の違いは、モデルにAction(control.Invoke)を渡して、メインスレッドで更新を呼び出すことです。

よろしく

+0

あなたはこれを理解することになりましたか?私は同じ問題を抱えています。 – Kohanz

+0

私は、データバインディングを追加すると、MonoでPropertyChangedEventに登録せず、.Netで登録することに気付きました。理由はまだ分かりません。 – soulsource

答えて

0

私は同じ問題を抱えている、すべてのコントロールを更新ViewModelに、で発生するアクションイベントを追加解く:

internal void InvokeUIControl(Action action) 
    { 
     // Call the provided action on the UI Thread using Control.Invoke() does not work in MONO 
     //this.Invoke(action); 

     // do it manually 
     this.lblTemp.Invoke(new Action(() => this.lblTemp.Text = ((MainViewModel)(((Delegate)(action)).Target)).Temperature)); 
     this.lblTime.Invoke(new Action(() => this.lblTime.Text = ((MainViewModel)(((Delegate)(action)).Target)).Clock));   
    } 
0

私は.NETとMonoと私の違いに気づいていました同じ問題がありました。イベントハンドラは、TextChanged」という名前が付けられていること

public event PropertyChangedEventHandler PropertyChanged; 
    public event EventHandler TextChanged; 

    protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      if (propertyName == "Text") 
      { 
       TextChanged?.Invoke(this, EventArgs.Empty); 
      } 
     } 
    } 

それは重要です:.NETとMonoのソースコードを比較した後、あなたがしたい場合はどのControl.TextChangedあなたが最初にあなたのモデル内に持っているViewFormでpropertyNameの通知を受け取ったことを最初に表示されます"TextChangedに通知するために。

private string _Text = ""; 
    public string Text { 
     get { 
      return _Text; 
     } 
     set { 
      if (_Text != value) { 
       NotifyPropertyChanged ("Text"); 
      } 
     } 
    } 
をそして今、あなたのビューで、あなたはこのような何かを行うことができます。 はその後まだあなたのモデルでは、あなたが設定することができます。

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace EventStringTest 
{ 
    public partial class Form1 : Form 
    { 
     Model md = Model.Instance; 

     public Form1() 
     { 
      InitializeComponent(); 
      textBox1.DataBindings.Add("Text", md, "Text", false 
       , DataSourceUpdateMode.OnPropertyChanged); 
      this.OnBindingContextChanged(EventArgs.Empty); 
      textBox1.TextChanged += (object sender, System.EventArgs e) => { }; 
     } 

     private void Form1_Load(object sender, EventArgs evt) 
     { 
      md.PropertyChanged += (object s, PropertyChangedEventArgs e) => { }; 

      // This is just to start make Text Changed in Model. 
      md.TimerGO(); 
     } 
    } 
} 

これはコードのようですが、まだエレガントで優れたソリューションを探しています。

関連する問題