【问题标题】:databinding a Dataset to a listbox...Datatemplate needs to display from multiple columns将数据集数据绑定到列表框...数据模板需要从多列显示
【发布时间】:2010-01-07 18:41:54
【问题描述】:

我试图解决这个问题已经有一段时间了。我想要一个带有数据集的数据绑定列表框。它可以得到。但我的问题是我希望我的数据模板在数据集中显示两个表中的列.我尝试了很多样本​​..但我发现的所有内容都只是将数据集作为 datacontext 并将单个表作为 itemsource。但我的条件是我的数据模板中需要多个表..

例如:

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

有什么办法可以做到这一点..?我很困惑...!

我尝试将 Dataset 作为 datacontext 并将 Itemsource 作为 {Binding} 但只显示一行...

【问题讨论】:

    标签: wpf data-binding listbox dataset


    【解决方案1】:

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

    1. MasterTable 类型为 IEnumerable&lt;MasterTableRow&gt;
    2. SelectedMaster 类型为 DataRowView
    3. MasterDetails 类型为 IEnumerable&lt;DetailsTableRow&gt;

    在您的视图模型中,放置您的DataSet 实例,并为属性返回适当的值。总而言之,您应该实现INotifyPropertyChanged 并在SelectedMaster 更改时为SelectedMasterMasterDetails 触发更改通知。

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

    【讨论】:

    • 感谢 Aviad...我也尝试过这样做,但我有一些疑问。首先,我不能在普通数据集上执行此操作..?我想我必须使用一个强类型的数据集..例如一个 XSD 实例。我试图用一个 xsd 来实现它,但我无法通过并且我得到了一些错误..作为回报 masterRow.GetDetailsTableRows();我收到错误,因为找不到 GetDetailsTableRows()。我做对了吗..?我可以有一个工作样本..?在此先感谢...
    • 是的,我的示例使用了带有MasterTableDetailsTable 的强类型数据集,您可以修改上述示例以使用常规(非类型)数据集,方法是使用GetChildRows 并传递关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多