2011-06-18 62 views
3

我正在玩wpf数据绑定,我遇到了一个问题。这里是我的代码:WPF绑定到DataContext与类和子类

MainWindow.xaml

<Window x:Class="TestWpf.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestWpf" 
     Title="MainWindow" Height="350" Width="525">  
    <StackPanel Name="stackpanel"> 
     <TextBox Name="tb1" Text="{Binding Path=A.Number}" /> 
     <TextBox Name="tb2" Text="{Binding Path=B.Number}" /> 
     <TextBlock Name="tbResult" Text="{Binding Path=C}" /> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MyClass myClass = new MyClass(); 
     myClass.A = new MySubClass(); 
     myClass.B = new MySubClass(); 
     stackpanel.DataContext = myClass; 
    } 
} 

MyClass.cs

class MyClass : INotifyPropertyChanged 
{ 
    private MySubClass a; 
    public MySubClass A 
    { 
     get { return a; } 
     set 
     { 
      a = value; 
      OnPropertyChanged("A"); 
      OnPropertyChanged("C"); 
     } 
    } 

    private MySubClass b; 
    public MySubClass B 
    { 
     get { return b; } 
     set 
     { 
      b = value; 
      OnPropertyChanged("B"); 
      OnPropertyChanged("C"); 
     } 
    } 

    public int C 
    { 
     get { return A.Number + B.Number; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
     } 
    }   
} 

MySubClass.cs

class MySubClass : INotifyPropertyChanged 
{ 
    private int number; 
    public int Number 
    { 
     get { return number; } 
     set 
     { 
      number = value; 
      OnPropertyChanged("Number"); 
     } 
    } 

    public MySubClass() 
    { 
     Number = 1; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
     } 
    }  
} 

现在的问题是,结合的作品很好,我运行应用程序之后。此外,值A.Number和B.Number更新正常,因为我在文本框中更改它们。但MyClass.C中的变量C仅在应用程序启动时才会更新,永远不会。我需要更改什么,以便在更改A.Number或B.Number时更新C.谢谢。

回答

3

更新数据模型时,您是直接在MySubClass实例上更改Number还是将新子类分配给MyClass实例?即:

myClass.A.Number = 5; // will trigger OnPropertyChanged on MySubClass, but not on MyClass 

不会触发A上的OnPropertyChanged(但当然会更新A.Number)。 对于这个工作,你必须做一些事情,如:

MySubClass v = new MySubClass() 
v.Number = 5; 
myClass.A = v; // will trigger OnPropertyChanged on MyClass 

更新的答案。 YOu可以做到这一点,以捕捉a和b中的任何财产变化。

public MyClass() 
{ 
    a.PropertyChanged += new PropertyChangedEventHandler(UpdateC); 
    b.PropertyChanged += new PropertyChangedEventHandler(UpdateC); 
} 

void UpdateC(object sender, PropertyChangedEventArgs e) 
{ 
    OnPropertyChanged("C"); 
} 
+0

感谢您的回答,但它可能以某种方式更新属性C而不实例化MySubClass – Marin

1
当我更改A.Number或B.Number时,需要更改什么以便C更新。

您需要听取A和B属性的更改。它应该工作,如果您将此代码添加到一个setter:



set 
{ 
if (a != null) 
{ 
a.PropertyChanged-=NumberChanged; 
} 
a = value; 
a.PropertyChanged+=NumberChanged; 
OnPropertyChanged("A"); 
OnPropertyChanged("C"); 
} 

private void NumberChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Number") 
    { 
    OnPropertyChanged("C"); 
    } 
} 


和B setter相同。