2013-09-13 3 views
4

У меня есть datagrid say Datagrid1, который заполнен списком (динамически через код позади). Внутри шаблона данных строки для datagrid, я хочу добавить datagrid, позволяет называть его datagrid2, datagrid2 необходимо динамически пополнять с помощью List on the SelectionChange событие Datagrid1? Доступ к datagrid2 и привязка его к источнику данных должен выполняться в коде. Может ли кто-нибудь помочь мне с этим? мой XAML является:Связать динамические данные с wpf datagrid внутри шаблона rowdetails

<Grid> 
     <my:DataGrid Name="dataGrid1" ItemsSource="{Binding}"> 
      <my:DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <my:DataGrid Name="dataGrid2"></my:DataGrid> 
       </DataTemplate> 
      </my:DataGrid.RowDetailsTemplate> 
     </my:DataGrid> 
    </Grid> 

ответ

6

Было бы гораздо проще сделать это с помощью привязок. Вы можете добавить коллекцию DetailElements в каждый элемент вашего ItemsSource вашего DataGrid1. Теперь все, что вам нужно сделать, это привязать эту коллекцию к вашему ItemsGrid2 '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> 

EDIT: Для поиска вашей базы данных в зависимости от значения DataGrid клеток, вы должны получить это значение в вашей ViewModel. Для этого создайте свойство (в моем примере ProductName) и привяжите его к свойству Binding 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"); 
     } 
    } 
} 
+0

Я хотел бы для заполнения dataGrid2 некоторыми продуктами из базы данных при изменении текста ячейки данныхGrid1 (например, «выберите ProductName из TblProducts, где ProductName Like«% »+ Datagrid1.cell.text +«% »), как это сделать сэр? – Mussammil

+0

Посмотрите на мое редактирование;) –

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

хорошо, когда элемент, выбранный из иннервида, я хочу сопоставить элементы с соответствующими ячейками OuterGrid, а иннергид должен сделать невидимым после того, как выбранный элемент будет назначен ячейке outergrid, как для достижения этой цели? – Mussammil

Смежные вопросы