将数据集数据绑定到列表框...数据窗口需要显示多个列

时间:2010-01-07 18:41:55

标签: wpf data-binding listbox dataset

我试图解决这个问题很长一段时间。我想要一个Databind一个带有Dataset.Simple的列表框,因为它可以得到。但我的问题是我希望我的datatemplate在数据集中显示来自两个表的列我已经尝试过很多样本..但是我发现的所有东西都只是将数据集作为datacontext给出了一个表作为itemsource.But我的条件是我想在我的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作为{Binding}但是只显示了一行......

1 个答案:

答案 0 :(得分:1)

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

    类型MasterTable
  1. IEnumerable<MasterTableRow> 类型SelectedMaster
  2. DataRowView 类型MasterDetails
  3. IEnumerable<DetailsTableRow>

    在您的视图模型中,放置DataSet的实例,并返回属性的相应值。要将其全部包装起来,每当INotifyPropertyChanged更改时,您应该SelectedMasterMasterDetails以及SelectedMaster实施点火通知。

    请记住将视图模型设置为绑定的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}"/>