2017-07-07 34 views
2

私は、パラメータを持っていてもいなくてもよいプロシージャを備えたモジュラーアプリケーションを開発しています。パラメータは各手続きにロードされ、実行の目標はユーザに必要なすべてのパラメータを入力するように要求し、次に余分な作業を行います。wpfの動的要素への動的双方向バインディング

私はすべてを読み込むことができたし、すべて正常に動作しますが、どのように各パラメータ値の動的バインディングを作成するのか分かりません。

これをテストするためのデモアプリケーションを作成しましたが、それを少しでも手抜きましたが、まだ動作していないようで、何が欠けているのかわかりません。ここで

は、実際のアプリケーションの簡易版であるデモアプリケーションのコードですが、コンセプトはしかしほとんど同じです:

public class TestBinding 
{ 
    public List<Val> Values {get;set;} 

    public TestBinding() 
    { 
     Values = new List<Val>(); 
     Values.Add(new Val {Caption = "First", Value = String.Empty}); 
     Values.Add(new Val {Caption = "Second", Value = String.Empty}); 
     Values.Add(new Val {Caption = "Third", Value = String.Empty}); 
    } 
} 

public class Val 
{ 
    public string Caption {get;set;} 
    public string Value {get;set;} 
} 

public TestBinding TB {get;set;} 
public Window1() 
{ 
    InitializeComponent(); 

    TB = new TestBinding(); 

    foreach(var x in TB.Values) 
    { 
     var txt = new TextBox() {Height = 25, Width = 150}; 

     var myBinding = new Binding("x.Value"); //???? Not sure about this 
     myBinding.Source = x.Value; 
     myBinding.Mode = BindingMode.TwoWay; 
     myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     BindingOperations.SetBinding(txt, TextBox.TextProperty, myBinding); 

     SPanel.Children.Add(txt); 
    } 

    var btn = new Button() {Height = 20, Width = 150, Content = "Show values"}; 

    btn.Click += new RoutedEventHandler(radioButton1_Click); 
    SPanel.Children.Add(btn); 
} 

private void radioButton1_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(var x in TB.Values) 
    { 
     MessageBox.Show(x.Value); 
    } 
} 

答えて

4

あなたがソースに結合Source対象とPathを混同していますそのオブジェクトのプロパティ。

それは次のようになります。

var myBinding = new Binding("Value"); 
myBinding.Source = x; 
myBinding.Mode = BindingMode.TwoWay; 
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 

または

var myBinding = new Binding 
{ 
    Path = new PropertyPath("Value"), 
    Source = x, 
    Mode = BindingMode.TwoWay, 
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
}; 

txt.SetBinding(TextBox.TextProperty, myBinding); 
+0

作品を魔法のように!説明してくれてありがとう! :) – DethoRhyne

+0

おっと、問題が発生しました!コードから値を変更すると(TB.Values [0] .Value = "ABC")、変更されたままですが、双方向バインディングであってもUI要素に変更が反映されません。 – DethoRhyne

+0

クラスValはINotifyPropertyChangedを実装する必要があります。 Valueプロパティが変更されたときにPropertyChangedイベントを発生させます。 – Clemens

関連する問題