2010-04-09 37 views
15

Tôi đang cố gắng lấy tên của thuộc tính được liên kết với một số cụ thể để tôi có thể thực hiện một số nội dung dựa trên đó. Chức năng này được gọi khi người dùng nhấp vào mục menu ngữ cảnh trên tiêu đề của cột ...WPF - Cách liên kết một DataGridTemplateColumn

Điều này là tốt cho các loại cột sẵn sàng sẵn sàng như hộp DataGridTextColumn, vì chúng bị ràng buộc nhưng vấn đề là một số cột của tôi là DataGridTemplateColumns, không bị ràng buộc.

private void GroupByField_Click (object sender, RoutedEventArgs e){ 
     MenuItem mi = (MenuItem)sender; 
     ContextMenu cm = (ContextMenu) mi.Parent; 
     DataGridColumnHeader dgch = (DataGridColumnHeader) cm.PlacementTarget; 
     DataGridBoundColumn dgbc = (DataGridBoundColumn) dgch.Column; 
     Binding binding = (Binding) dgbc.Binding; 
     string BoundPropName = binding.Path.Path; 

     //Do stuff based on bound property name here... 
    } 

Vì vậy, lấy ví dụ như cột Name của tôi ... đó là một DataGridTemplateColumn (vì nó có một hình ảnh và một số công cụ khác trong đó). Do đó, nó không thực sự bị ràng buộc với thuộc tính 'Tên' ... nhưng tôi muốn, vì vậy mã trên sẽ hoạt động.

Câu hỏi của tôi là hai phần, thực sự:

  1. Có thể làm cho một DataGridTemplateColumn bị ràng buộc, do đó các mã trên sẽ làm việc? Tôi có thể ràng buộc nó bằng cách nào đó với một tài sản?

  2. Hoặc tôi có cần điều gì đó hoàn toàn khác và thay đổi mã ở trên không?

Cảm ơn bạn trước!

AT

Trả lời

0
  1. Không, bởi vì DataGridTemplateColumn không kế thừa từ DataGridBoundColumn, vì vậy các diễn viên để DataGridBoundColumn sẽ thất bại.
    Để làm cho mã trên hoạt động, tất cả các cột của bạn phải được kế thừa từ DataGridBoundColumn lớp trừu tượng. Vì vậy, việc tạo các lớp Cột có nguồn gốc tùy chỉnh thay vì DataGridTemplateColumn sẽ hoạt động.

  2. Bạn chỉ có thể cư một

    Dictionary<DataGridColumn, string> BoundPropName;

    trên khởi tạo và sau đó làm

    var propName = BoundPropName[dgch.Column]

2

Đó là một khó khăn. Chúng tôi đã đạt được các ràng buộc bằng cách đi qua để ông bà của mình UserControl (chúng tôi đã có DataGrid bên trong một UserControl) và UserControl đã bị ràng buộc với một Presenter (Model trong trường hợp của chúng tôi). Trong đoạn mã dưới đây, kiểm tra thuộc tính SelectedItem của AutoCompleteBox được đặt bên trong DataGridTemplateColumn.

<wpfToolkit:DataGridTemplateColumn Header="{x:Static resources:Store.ItemNameC}" Width="0.60*"> 
    <wpfToolkit:DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <extended:HOAutoCompleteBox 
          IsTextCompletionEnabled ="True" 
          x:Name="ItemAutoCompleteBox" 
          Populating="ItemAutoCompleteBox_Populating" 
          DefaultType="HealthObject.ObjectModel.pSearchStockItemResult,HealthObject.ObjectModel" 
          Text="{Binding Path= ItemName, Mode=TwoWay}" 
          <!--- **** HERE IS THE BINDING SAMPLE *****--> 
      SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Model.SelectedStockItem, Mode=TwoWay}"> 
     </extended:HOAutoCompleteBox> 
    </DataTemplate> 
    </wpfToolkit:DataGridTemplateColumn.CellEditingTemplate> 

</wpfToolkit:DataGridTemplateColumn> 
1

Bạn có thể sử dụng dgbc.ClipboardContentBinding;

25

Mặc dù bạn không thể ràng buộc một mẫu cột, bạn có thể ràng buộc một trong các điều khiển được tổ chức tại cột đó.Đây là cách tôi giải quyết một vấn đề tương tự:

<DataGridTemplateColumn Header="ColumnHeader"> 
    <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <local:CustomisedUIElement Text="{Binding Path=PropertyToBindTo}"/> 
      </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Nếu tôi đã hiểu ví dụ ban đầu đúng cách, điều này có nghĩa thay đổi logic của phương pháp GroupByField_Click() để kiểm tra xem cột gửi là một mẫu cột và sau đó nhìn vào các phần tử chứa trong đối tượng Binding.

2

Đối với tôi, ClipboardContentBinding của DataGridTemplateColumn là một giải pháp:

Private Function FindBoundProperty(ByVal col As DataGridColumn) As String 

    Dim boundColumn As DataGridBoundColumn = TryCast(col, DataGridBoundColumn) 
    Dim boundPropertyName As String = "" 
    Dim binding As Binding 
    If col.DependencyObjectType.Name = "DataGridTextColumn" Then 
     binding = TryCast(boundColumn.Binding, Binding) 
     boundPropertyName = binding.Path.Path 
    End If 
    If col.DependencyObjectType.Name = "DataGridTemplateColumn" Then 
     binding = TryCast(col.ClipboardContentBinding, Binding) 
     boundPropertyName = binding.Path.Path 
    End If 
    Return boundPropertyName 

End Function 
Các vấn đề liên quan