2010-01-07 61 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