2009-11-18 26 views
11

Tôi có một số DataGrid trong WPF. Và tôi đang cố gắng để thêm Button s vào các ô nhất định của lưới, sau khi nó được ràng buộc với một số ItemsSource cụ thể. Tôi đã cố gắng thực hiện điều này trong xaml như sau:Mã đằng sau cho datagridtemplatecolumn là gì và cách sử dụng nó?

<dg:DataGridTemplateColumn x:Name="R1" CanUserReorder="False" IsReadOnly="False">    
    <dg:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <awc:ImageButton Content="Edit" Name="btnEdit" Visibility="Collapsed"/> 
     </DataTemplate> 
    </dg:DataGridTemplateColumn.CellTemplate> 
</dg:DataGridTemplateColumn> 

Tuy nhiên, tôi muốn biết làm cách nào tôi có thể thực hiện điều này trong mã phía sau. Tôi cần điều này để tôi có thể đặt Button s bất cứ khi nào một nhấp chuột cụ thể thậm chí diễn ra. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

22

sử dụng này:

DataGridTemplateColumn col1 = new DataGridTemplateColumn(); 
col1.Header = "MyHeader"; 
FrameworkElementFactory factory1 = new FrameworkElementFactory(typeof(CheckBox)); 
Binding b1 = new Binding("IsSelected"); 
b1.Mode = BindingMode.TwoWay; 
factory1.SetValue(CheckBox.IsCheckedProperty, b1); 
factory1.AddHandler(CheckBox.CheckedEvent, new RoutedEventHandler(chkSelect_Checked)); 
DataTemplate cellTemplate1 = new DataTemplate(); 
cellTemplate1.VisualTree = factory1; 
col1.CellTemplate = cellTemplate1; 
dgTransportReqsts.DataGrid.Columns.Add(col1); 

Tôi sử dụng này để thêm CheckBox trong DataGridTemplateColumn của tôi khi chạy. Hy vọng điều này sẽ giúp !!

+0

Xin lỗi vì đã tạo đề tài cũ, nhưng trong trường hợp Button tại 'FrameworkElementFactory (typeof (Button))', làm cách nào để thêm văn bản nút? Tôi đã không thể làm như vậy, hoặc tôi đang thiếu một cái gì đó? –

+1

@Mã Sinha, sử dụng factory1.SetValue (Nút.ContentProperty, b1); Bạn có thể đặt bất kỳ thuộc tính nào của Button trong trường hợp của bạn giống như cách tôi thiết lập thuộc tính IsChecked của CheckBox trong ví dụ trên. – viky

+0

Ngọt ngào! Rất dễ!! Cảm ơn rất nhiều. –

3

Câu trả lời của Anurag sẽ hoạt động rất tốt cho bạn nếu bạn muốn thêm các nút trước khi lưới được khởi tạo, trước khi bạn thêm cột vào lưới.

Nếu bạn muốn thêm nút vào ô lưới sau khi lưới đã được xây dựng, bạn có thể thực hiện điều đó bằng cách thực hiện thay đổi đối tượng DataGridCell. Trước tiên, bạn phải tìm nó:

  1. Tìm DataGridCell bằng cách sử dụng DataGridColumn.GetCellContent
  2. Sử dụng VisualTreeHelper để quét lên cây thị giác đến DataGridCell

Một khi điều này được thực hiện, có một số cách để thêm một nút đến DataGridCell, tùy thuộc vào những gì bạn đang cố gắng đạt được:

  • Đặt DataGridCell.Template t oa ControlTemplate chứa các nút và các phong cách mà bạn mong muốn, -HOẶC-
  • Đặt DataGridCell.ContentTemplate đến một DataTemplate chứa các nút và các mặt hàng khác mà bạn mong muốn, -HOẶC-
  • Có của DataTemplate cột của bạn bao gồm một bảng điều khiển giữ chỗ để giữ nút mới, tìm kiếm cây thị giác cho bảng điều khiển này bằng cách Name và thêm nút của bạn vào đó.

Một phương pháp khác mà không yêu cầu tìm kiếm các tế bào là:

  1. Bao gồm một tài sản ObservableCollection<T> trong mô hình quan điểm của bạn mà cung cấp các thông tin để tạo các nút
  2. Trong DataTemplate của bạn bao gồm ItemsControl tham chiếu đến thuộc tính này và có một DataTemplate có thể tạo nút chính xác ra khỏi loại T
  3. Khi bạn muốn thêm nút, chỉ cần thêm một mục vào ObservableCollection thuộc tính
Các vấn đề liên quan