2012-11-21 96 views
1

我想設置類實例和兩個WPF文本框之間的綁定。儘管如此,文本框不會改變他們的狀態,我無法弄清楚我做錯了什麼。代碼隱藏中的數據綁定

XAML

<DockPanel> 
    <TextBlock Style="{StaticResource caption}">Testing System</TextBlock> 
    <TextBlock DockPanel.Dock="Left" x:Name="txt1" Text="DC"/> 
    <TextBlock DockPanel.Dock="Right" x:Name="txt2" Text="PD"/> 
    <Button Height="20" Width="100" Click="clickBinding">Bind</Button> 
    <Button Height="20" Width="100" Click="clickChangeBinding">Change Status</Button> 
</DockPanel> 

MainWindow.xaml.cs

private ADSbinding myADS = new ADSbinding(); 
private void clickBinding(object sender, RoutedEventArgs e) 
{ 
    Binding b1, b2; 

    b1 = new Binding(); 
    b2 = new Binding(); 
    b1.Source = myADS.DeviceConfigured; 
    b2.Source = myADS.ProcessingData; 


    b1.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
    b2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 

    BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1); 
    BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2); 
    } 

    private void clickChangeBinding(object sender, RoutedEventArgs e) 
    { 
     myADS.changedata(); 
    } 

類別:

public class ADSbinding : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string deviceConfigured = "false"; 
    private string processingData = "false"; 

    public ADSbinding() 
    { 
     ProcessingData = "true"; 
    } 

    // Get-Set methods 
    public string DeviceConfigured 
    { 
     get { return deviceConfigured; } 
     set 
     { 
     deviceConfigured = value; 
     Changed("DeviceConfigured"); 
     } 
    } 
    public string ProcessingData 
    { 
     get { return processingData; } 
     set 
     { 
     processingData = value; 
     Changed("ProcessingData"); 
     } 
    } 

    private void Changed(string propertyName) 
    { 
     if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public void changedata() 
    { 
     DeviceConfigured = "change"; 
     ProcessingData = "change"; 
    } 
} 

當按下 「clickBinding」 狀態變化,當 「clickChangeBinding」 它保持,由再次點擊「clickBinding」它會改變。它是一個非常直接的嘗試,我不知道問題在哪裏。任何人?

回答

1

創建綁定時,您將Source設置爲對象的屬性,而不是對象本身。你應該在Binding構造函數指定屬性的名稱,然後將源設置爲你的對象:

b1 = new Binding("DeviceConfigured"); 
    b2 = new Binding("ProcessingData"); 
    b1.Source = myADS; 
    b2.Source = myADS; 
+0

非常感謝! – RobaL

2

此外BDE答案的你也可以做一個擴展方法,使您可以直接設置在結合使用在FrameworkElement的

public static void SetBinding(this FrameworkElement target, DependencyProperty property, TargetType source, Expression<Func<TargetType, PropertyType>> property_accessor) 
{ 
    var binding = new Binding(source.PropertyName(property_accessor)); 
    binding.Source = source; 
    target.SetBinding(property, binding); 
} 


public static string PropertyName(this TargetType obj, Expression<Func> property_accessor) 
{ 
return ((MemberExpression)property_accessor.Body).Member.Name; 
} 

而不是鍵入

BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1); 
BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2); 

您可以使用所definied擴展方法SetBinding以上

txt1.SetBinding(TextBlock.TextProperty, myADS, x => x.DeviceConfigured); 
txt2.SetBinding(TextBlock.TextProperty, myADS, x => x.ProcessingData); 

這種方式可以避免將屬性的名稱作爲字符串傳遞。

+0

TargetType在哪裏? – Rhyous