将动态数据绑定到行详细信息模板中的 wpf 数据网格
本文关键字:wpf 数据 网格 数据网 数据绑定 动态 详细信息 | 更新日期: 2023-09-27 18:31:06
我有一个数据网格,说Datagrid1填充了一个列表(通过代码隐藏动态)。在数据网格的行详细信息模板中,我想添加一个数据网格,我们称之为datagrid2,datagrid2需要在Datagrid1的SelectionChange事件上动态弹出List?访问 datagrid2 并将其绑定到数据源需要在代码隐藏中完成。索蒙能帮我解决这个问题吗?我的 XAML 是:
<Grid>
<my:DataGrid Name="dataGrid1" ItemsSource="{Binding}">
<my:DataGrid.RowDetailsTemplate>
<DataTemplate>
<my:DataGrid Name="dataGrid2"></my:DataGrid>
</DataTemplate>
</my:DataGrid.RowDetailsTemplate>
</my:DataGrid>
</Grid>
通过绑定来做到这一点要容易得多。您可以将 DetailElements 的集合添加到 dataGrid1 的 ItemsSource 的每个元素中。现在,您所要做的就是将此集合绑定到dataGrid2的ItemsSource,然后通过绑定自动填充数据。
public class DataGrid1SourceItem
{
public ObservableCollection<DetailItem> DetailItems {get;set;}
}
XAML:
<Grid>
<my:DataGrid Name="dataGrid1" ItemsSource="{Binding}">
<my:DataGrid.RowDetailsTemplate>
<DataTemplate>
<my:DataGrid Name="dataGrid2" ItemsSource="{Binding Path=DetailItems}"></my:DataGrid>
</DataTemplate>
</my:DataGrid.RowDetailsTemplate>
</my:DataGrid>
</Grid>
编辑:要根据DataGrid单元格值搜索数据库,必须将此值放入ViewModel中。为此,创建一个属性(在我的示例中ProductName
)并将其绑定到 DataGridColumn 的绑定属性 (Mode=TwoWay)。然后,您可以拥有一个包含所有产品的私有字段,并在dataGrid2 ItemsSources集合中过滤此字段:
public class DataGrid1SourceItem
{
private List<DetailItems> _allDetailItems = new List<DetailItems>();
public IEnumerable<DetailItem> DetailItems
{
get { return _allDetailItems.Where(item => item.Name == ProductName); }
}
public DataGrid1SourceItem()
{
// load your products into _allDetailItems
}
private string _productName;
public string ProductName
{
get { return _productName; }
set
{
_productName= value;
OnPropertyChanged("ProductName");
OnPropertyChanged("DetailItems");
}
}
}
以下内容可能会对您有所帮助
public partial class Window1 : Window
{
DataTable dt = new DataTable();
public Window1()
{
InitializeComponent();
dt.Columns.Add("Num1", typeof(string));
dt.Columns.Add("Num2", typeof(string));
dt.Rows.Add("100", "200");
dt.Rows.Add("300", "400");
this.dataGridTest.DataContext = dt;
this.dataGridTest.RowDetailsVisibilityChanged += new EventHandler<Microsoft.Windows.Controls.DataGridRowDetailsEventArgs>(dataGridTest_RowDetailsVisibilityChanged);
}
void dataGrid1_RowDetailsVisibilityChanged(object sender, Microsoft.Windows.Controls.DataGridRowDetailsEventArgs e)
{
Microsoft.Windows.Controls.DataGrid innerDataGrid = e.DetailsElement as Microsoft.Windows.Controls.DataGrid;
innerDataGrid.ItemsSource = ((IListSource)dt).GetList();
}
}
在 XAML 中
<Grid>
<my:DataGrid Name="dataGridTest" ItemsSource="{Binding}">
<my:DataGrid.RowDetailsTemplate>
<DataTemplate>
<my:DataGrid Name="innerGrid"></my:DataGrid>
</DataTemplate>
</my:DataGrid.RowDetailsTemplate>
</my:DataGrid>
</Grid>