2017-05-18 1 views
2

아래 계층 구조가 있습니다.공유 중첩 객체가 업데이트되면 모든 부모 업데이트

<DataGrid ItemsSource="{Binding Rows}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="#" Width="200"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Cell.Text}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ListBox ItemsSource="{Binding Cell.CellLinks}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <TextBox Text="{Binding Text, Mode=TwoWay}"/> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

CellValueViewModel 여러 CellLinkViewModel에서 공유되고, 같은

public class RowViewModel : BaseViewModel 
    { 
     private CellViewModel cell; 
     public CellViewModel Cell 
     { 
      get { return cell; } 
      set 
      { 
       cell = value; 
       OnPropertyChanged("Cell"); 
      } 
     } 
    } 

public class CellViewModel : BaseViewModel 
    { 
     public string Text { get { return string.Join("\n", CellLinks.Select(c => c.Text)); } } 
     private ObservableCollection<CellLinkViewModel> cellLinks; 
     public ObservableCollection<CellLinkViewModel> CellLinks 
     { 
      get 
      { return cellLinks; } 
      set 
      { 
       cellLinks = value; 
       OnPropertyChanged("CellLinks"); 
      } 
     } 
    } 
public class CellLinkViewModel : BaseViewModel 
    { 
     public string Text 
     { 
      get { return CellValue.Text; } 
      set 
      { 
       CellValue.Text = value; 
       OnPropertyChanged("Text");    
      } 
     } 
     public CellValueViewModel CellValue { get; set; } 
    } 
public class CellValueViewModel : BaseViewModel 
    { 
     public string Text { get; set; } 
    } 
public class BaseViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName); 
       PropertyChanged(this, e); 
      } 
     } 
    } 

XAML 코드가 보인다. CellValueViewModel을 변경하면 모든 종속 부모에 변경 사항을 전파해야하며 DataGrid는 모든 최신 값을 표시해야합니다.

이 결과

This is result

이다 그러나 나는 그것의 내가 여기서 뭔가를 놓치고, 자동으로 안될 것 같아? 중첩 된 개체가 업데이트 될 때 자동으로 업데이트되도록 모든 DataGrid 셀에 알림을 보내는 방법

public class CellViewModel : BaseViewModel 
{ 
    public string Text { get { return string.Join("\n", CellLinks.Select(c => c.Text)); } } 

    private ObservableCollection<CellLinkViewModel> cellLinks; 
    public ObservableCollection<CellLinkViewModel> CellLinks 
    { 
     get 
     { 
      return cellLinks; 
     } 
     set 
     { 
      cellLinks = value; 
      if(cellLinks != null) 
      { 
       foreach(var link in cellLinks) 
       { 
        link.PropertyChanged += Link_PropertyChanged; 
       } 
      } 
      OnPropertyChanged("CellLinks"); 
     } 
    } 

    private void Link_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     OnPropertyChanged("Text"); 
    } 
} 

당신은 아마 또한 원하는 :

답변

1

당신은 예를 들어, 모든 CellLinkViewModel 개체에 대한 PropertyChanged 이벤트에 이벤트 핸들러를 연결하고 링크가 수정 될 때마다 CellViewModelText 속성에 대한 PropertyChanged 이벤트를 발생합니다 ObservableCollection<CellLinkViewModel>CollectionChanged 이벤트를 처리하고 이벤트 처리기를 연결하여 CellLinkViewModel 개체를 동적으로 추가합니다.

+0

ObservableCollection에 항목을 붙여 넣을 수는 있지만 접근 방식은 동일해야합니다. – Rekshino

+0

고맙습니다 @ mm8, 솔루션 작동합니다. 나는 이벤트의 등록 취소를 처리해야 할 것이다. – Raj