2017-07-07 113 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