2010-01-07 1 views
0

나는 꽤 없단이를 알아 내려고했다가 데이터 바인딩에게 Dataset.Simple와 목록 상자를 원하는 여러 열에서 표시해야 그게 내 datatemplate dataset.I 두 테이블에서 열을 표시하려면 원하는 많은 samles ..하지만 내가 찾은 모든 datacontext datacontext 같이 제공하고 itemsource.But 단일 조건으로 내 조건이 더 있습니다. 내 DataTemplate을 한 테이블 .. 예를 들어은 ... DataTemplate을은 내 문제를 get.But 수

이상 :

<DataTemplate x:Key="EmployeeDataTemplate"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="60"/> 
     <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
    <Border Margin="5" BorderBrush="Black" BorderThickness="1"> 
     <Image Source="{Binding Path=Mast/Image}" Stretch="Fill" Width="50" Height="50" /> 
    </Border> 
    <StackPanel Grid.Column="1" Margin="5"> 
     <StackPanel Orientation="Horizontal" TextBlock.FontWeight="Bold" > 
     <TextBlock Text="{Binding Path=Mast/Firstname}" /> 
     <TextBlock Text="{Binding Path=Mast/Lastname}" Padding="3,0,0,0"/> 
     </StackPanel> 
     <TextBlock Text="{Binding Path=Details/Age}" /> 
     <TextBlock Text="{Binding Path=Details/Role}" /> 
    </StackPanel> 
    </Grid> 
</DataTemplate> 

이 작업을 수행 할 수있는 방법 ..? 나는 혼란 스럽다 ...!

나는대로 데이터 컨텍스트와 같은 데이터 집합 및 Itemsource를주는 시도

답변

1

당신은 세 가지 속성을 노출하는 뷰 모델 클래스 작성해야 ... {바인딩} 그러나 하나의 행이 표시됩니다의

  1. MasterTable을 입력 유형의 IEnumerable<MasterTableRow>
  2. SelectedMaster 유형의 DataRowView
  3. MasterDetailsIEnumerable<DetailsTableRow>
  4. 뷰 모델에서

, 당신의 DataSet의 인스턴스를 넣어 속성에 해당하는 값을 반환합니다. 모든 것을 마무리하려면 SelectedMaster이 변경 될 때마다 SelectedMasterMasterDetails에 대해 INotifyPropertyChanged 및 화재 변경 알림을 구현해야합니다.

뷰 모델을 바인딩의 경우 DataContext으로 설정해야합니다.

public partial class ViewModel : INotifyPropertyChanged 
{ 
    DataSet1 ds; 
    DataRowView selectedMaster; 

    public IEnumerable<DataSet1.MasterTableRow> MasterTable 
    { 
     get { return ds.MasterTable; } 
    } 

    public DataRowView SelectedMaster 
    { 
     get { return selectedMaster; } 
     set 
     { 
      if (selectedMaster != value) 
      { 
       selectedMaster = value; 
       OnPropertyChanged("MasterDetails"); 
       OnPropertyChanged("SelectedMaster"); 
      } 
     } 
    } 

    public IEnumerable<DataSet1.DetailsTableRow> MasterDetails 
    { 
     get 
     { 
      var masterRow = (DataSet1.MasterTableRow)SelectedMaster.Row; 
      return masterRow.GetDetailsTableRows(); 
     } 
    } 

    #region INotifyPropertyChanged Members 

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

    #endregion 
} 

는 XAML에서 바인딩은 다음과 같습니다 : 여기

는 것처럼 보일 수 있습니다 방법

<ListBox ItemsSource="{Binding MasterTable}" 
     SelectedItem="{Binding SelectedMaster}" 
     ItemTemplate="{StaticResource MasterTemplate}"/> 
<ListBox ItemsSource="{Binding MasterDetails}" 
     ItemTemplate="{StaticResource DetailsTemplate}"/> 
+0

감사 Aviad ... 나는 동일한 작업을 수행하려고하지만 난 약간의 의심이 .FIrst 모두의, 나는 정상적인 데이터 세트에서 이것을 할 수 없다. ..? 나는 내가 strogly 입력 datset..for 예를 들어 XSD에 instance.I가 XSD와이를 구현하기 위해 노력 사용해야하지만) (내가 통과하지 못할와 내가 어떤 errors..In 반환 masterRow.GetDetailsTableRows을 가지고 추측; GetDetailsTableRows()를 찾을 수 없으므로 오류가 발생합니다. 바로 작업을하고 있습니다. ..? 나는 일할 샘플을 가질 수 있을까 ..? 덕분에 미리 ... – biju

+0

예 내 예는'사용 GetChildRows'과의 관계를 전달하여, 일반 (비 형식화 된) 데이터 집합을 사용하는 위의 샘플을 수정할 수있는'MasterTable'과'DetailsTable' 당신과 함께 강력하게 형식화 된 데이터 집합을 사용 . –