2010-01-07 59 views
0

我试图找出相当长的一段时间。我想Databind列表框中有一个Dataset.Simple,因为它可以get.But我的问题是我希望我的datatemplate显示来自两个表中的列,在数据集中。我尝试了许多samles ..但我发现的一切只是给数据集作为datacontext,并提供一个表作为itemsource.But我的情况是,我想要更多比我的DataTemplate一个表..数据绑定数据集到列表框... Datatemplate需要显示多列

对于如:

<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> 

任何方式做到这一点..?我很困惑...!

我试着给数据集作为的datacontext和作为的ItemSource绑定{}但只显示一行...

回答

1

您应该创建一个公开三个属性视图模型类:

  1. MasterTable键入IEnumerable<MasterTableRow>
  2. 类型的SelectedMasterDataRowView
  3. 类型的MasterDetailsIEnumerable<DetailsTableRow>

在您的视图模型中,放入您的DataSet的实例,并返回适当的属性值。为了将其全部包装起来,每当SelectedMaster发生变化时,您应该实施INotifyPropertyChangedSelectedMasterMasterDetails的更换火灾通知。

请记住设置视图模型为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

感谢阿维亚德......我试图做同样的,但我有一些疑问首先,我不能在一个正常的数据集上做这个权利..?我想我必须使用一个strogly类型的datset..for例如一个XSD实例。我试图用xsd实现这一点,但我无法通过,我得到了一些错误..在 返回masterRow.GetDetailsTableRows(); 我得到错误becasue GetDetailsTableRows()无法找到。我正在做的事情.. ..?我可以有一个工作样本..?在此先感谢... – biju 2010-01-08 13:45:12

+0

是的我的示例使用强类型的数据集与一个'MasterTable'和一个'DetailsTable'你可以修改上面的示例使用常规(非类型)数据集,通过使用'GetChildRows'并传递关系。 – 2010-01-08 14:52:18