将动态数据绑定到WPF数据网格中的行详细信息模板。

4

我有一个数据网格,称为Datagrid1,它通过后端代码动态填充列表。在数据网格的行详细信息模板中,我想添加一个datagrid,叫做datagrid2,datagrid2需要在Datagrid1的SelectionChange事件上动态填充列表?访问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>
2个回答

6

通过绑定做这件事情会更容易。您可以向数据网格1(dataGrid1)的每个元素添加一个DetailElements集合。现在,您只需将此集合绑定到数据网格2(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的Binding属性(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");
        }
    }
}

当dataGrid1单元格文本更改时(例如“select ProductName from TblProducts where ProductName Like '%"+Datagrid1.cell.text+"%'”),我想用数据库中的一些产品填充dataGrid2。请问如何实现? - Mussammil

3
以下内容可能对您有所帮助。
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>

好的,当从内部表格中选择一个项目时,我想将这些项目映射到外部表格的相应单元格,并且在将选定项目分配给外部表格单元格后,内部表格必须变为不可见。如何实现这一点? - Mussammil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接