2014-03-05 4 views
0

내 요구 사항은 datacontext에서 발생하는 변경 사항을 추적하며 속성 변경시 새 viewmodel을 내역 item.first로 추가했습니다. 두 번째 변경 사항도 반영됩니다. 역사는 이미 추가 된 아이템입니다. 내가 잘못하고있는 것은 도움을주십시오.MVVM 추적 문제 viewmodel

public partial class MainWindow : Window 
{ 
    private List<Employee> history; 

    public List<Employee> History 
    { 
     get { return history; } 
     set { history = value; } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     History = new List<Employee>(); 
     this.DataContext = new Employee(); 
     if (DataContext != null) 
     { 
      this.DataContextChanged += new DependencyPropertyChangedEventHandler(MainWindow_DataContextChanged); 
      (this.DataContext as Employee).PropertyChanged += new PropertyChangedEventHandler(MainWindow_PropertyChanged); 
     } 
    } 

    private void MainWindow_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     History.Add((Employee)this.DataContext); 
    } 

    private void MainWindow_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
    } 
} 

public class Employee : INotifyPropertyChanged 
{ 
    private List<Employee> history; 

    public List<Employee> History 
    { 
     get { return history; } 
     set { history = value; } 
    } 

    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; RaisePropertyChanged("Name"); } 
    } 

    private string ph; 

    public string PH 
    { 
     get { return ph; } 
     set { ph = value; RaisePropertyChanged("PH"); } 
    } 

    private DateTime dob; 

    public DateTime DOB 
    { 
     get { return dob; } 
     set { dob = value; RaisePropertyChanged("DOB"); } 
    } 

    private int age; 

    public int Age 
    { 
     get { return age; } 
     set { age = value; RaisePropertyChanged("Age"); } 
    } 

    public Employee() 
    { 
     History = new List<Employee>(); 
     Name = "MKumar"; 
     Age = 10; 
     DOB = new DateTime(2004, 7, 8); 
     PH = "999999999"; 
     PropertyChanged += new PropertyChangedEventHandler(Employee_PropertyChanged); 
    } 

    private void Employee_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     History.Add(this); 
     //throw new NotImplementedException(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

감사

개체가 reference type 같이 정상

답변

3

. 당신은

이 내가 오늘 배울 멋진 일이 될 수도 있습니다

private void Employee_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    var empCloned = DeepClone(this); 
    History.Add(empCloned); 
    //throw new NotImplementedException(); 
} 

깊은 복사

private T DeepClone<T>(T obj) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, obj); 
     ms.Position = 0; 

     return (T) formatter.Deserialize(ms); 
    } 
} 
+0

뭔가를 시도하여 기록 목록에서 changments을 반영하기 위해 deep copy을해야한다 ! K-B, 고마워요! OP (Kumar)의 경우 - 사용하는 클래스가 serializable인지 확인하십시오.) –

+0

감사합니다 ... 감사합니다. – WPFUser