Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-如何绑定DataGridTemplateColumn_C#_Wpf_Binding_Datagrid_Datagridtemplatecolumn - Fatal编程技术网

C# WPF-如何绑定DataGridTemplateColumn

C# WPF-如何绑定DataGridTemplateColumn,c#,wpf,binding,datagrid,datagridtemplatecolumn,C#,Wpf,Binding,Datagrid,Datagridtemplatecolumn,我正在尝试获取与特定的DataGridColumn关联的属性的名称,这样我就可以在此基础上做一些事情。当用户单击列标题上的上下文菜单项时,将调用此函数 这对于像DataGridTextColumn这样的开箱即用的滚动列类型很好,因为它们是绑定的,但问题是我的一些列是DataGridTemplateColumns,它们没有绑定 private void GroupByField_Click (object sender, RoutedEventArgs e){ MenuItem m

我正在尝试获取与特定的
DataGridColumn
关联的属性的名称,这样我就可以在此基础上做一些事情。当用户单击列标题上的上下文菜单项时,将调用此函数

这对于像
DataGridTextColumn
这样的开箱即用的滚动列类型很好,因为它们是绑定的,但问题是我的一些列是
DataGridTemplateColumns
,它们没有绑定

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...
    }
因此,以我的
Name
列为例。。。它是一个
DataGridTemplateColumn
(因为它有一个图像和一些其他内容)。因此,它实际上没有绑定到“Name”属性。。。但是我想这样做,这样上面的代码就可以工作了

我的问题分为两部分:

  • 是否可以绑定
    DataGridTemplateColumn
    ,以便上面的代码可以工作?我可以把它绑定到一个属性上吗

  • 或者我需要做一些完全不同的事情,并更改上面的代码

  • 提前谢谢

  • 否,因为
    DataGridTemplateColumn
    没有继承自
    DataGridBoundColumn
    ,因此对
    DataGridBoundColumn
    的转换将失败。
    要使上述代码正常工作,所有列必须继承自
    DataGridBoundColumn
    abstract类。因此,创建自定义派生列类而不是
    DataGridTemplateColumn
    应该是可行的

  • 您可以简单地填充

    字典名

    初始化,然后执行

    var-propName=BoundPropName[dgch.Column]


  • 这是个棘手的问题。我们通过遍历到它的祖辈UserControl(我们在UserControl中有DataGrid)来实现绑定,并且UserControl被绑定到一个Presenter(在我们的例子中是模型)。 在下面的代码中,检查DataGridTemplate列中的AutoCompleteBox的SelectedItem属性

    <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>
    
    
    你可以用
    
    dgbc.ClipboardContentBinding

    尽管不能绑定模板列,但可以绑定该列中的一个控件。这就是我解决类似问题的方法:

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

    如果我正确理解了最初的示例,这意味着更改
    GroupByField\u Click()
    方法的逻辑,以检查发送列是否是模板列,然后查看其中包含的元素以获得绑定对象。

    对于我来说,
    DataGridTemplateColumn
    ClipboardContentBinding
    是一种解决方案:

    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