【问题标题】:Binding to DataGridTemplateColumn绑定到 DataGridTemplateColumn
【发布时间】:2011-04-06 17:51:57
【问题描述】:

我有一个用户表,并且我有一个来自 Book 表的该表的外键。 FK 是 ProxyResponsibleUser_ID。当我在 DataGrid 中使用 DataGridTextColumn 时,一切正常,但现在我想使用 DataGridTemplateColumn 为具有 ProxyResponsibleUser_ID 的相应用户显示用户表中的 FullName 列。我收到一个错误,因为 DataGridTemplateColumn 没有 Binding 属性。

那么,我将通过 DataGridTemplateColumn 的哪个属性绑定 ProxyResponsibleUser_ID? 提前致谢。

<DataGridTextColumn x:Name="securityConfigurationNameColumn" Binding="{Binding Path=SecurityConfigurationName}" Header="Security Configuration Name" Width="*" />
<DataGridTemplateColumn x:Name="proxyResponsibleUser_IDColumn"   Binding="{Binding Path=ProxyResponsibleUser_ID}" Header="Proxy Responsible User ID" Width="*" >
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate DataType="{x:Type domain:User}">
                        <TextBlock Text="{Binding FullName}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

【问题讨论】:

    标签: wpf datagrid datagridtemplatecolumn


    【解决方案1】:

    我为这个问题纠结了好久,经过多次无果的搜索,我想出了一个可以接受的替代品。

    对于其他搜索此内容的人: 尝试创建 DataGridBoundColumn 的自定义实现。您只需要覆盖两个方法:GenerateElement 和 GenerateEditingElement。

    例子:

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        Label element = new Label();
        element.SetBinding(Label.ContentProperty, Binding);
    
        return element;
    }
    

    用法:

    <DataGrid>
        <DataGrid.Columns>
            <DataGridCustomColumn Binding="{Binding SomeProperty}" />
            <DataGridCustomColumn Binding="{Binding OtherProperty}" />
        </DataGrid.Columns>
    </DataGrid>
    

    虽然我最初打算使用模板,但我选择在代码隐藏中创建元素,因为我的需求相当简单;但是,鉴于正确的 DependencyProperty 注册,我认为这没有理由不能适应 DataTemplates。

    【讨论】:

      【解决方案2】:

      我不知道你到底想做什么,但绑定必须在 TextBlock 完成,就像你已经做的那样。因此 DataGridTemplateColumn-Tag 中的绑定是不必要的。列不需要知道记录的id。

      如果您希望文本框控件可以使用 id(通常不需要,因为您可以直接通过 DataContext 访问此属性),您可以通过绑定 Tag-property 来做到这一点。

      <TextBlock Text="{Binding FullName}" Tag="{Binding ProxyResponsibleUser_ID}"/> 
      

      顺便说一句,您在 EditTemplate 中声明了一个 TextBlock。也许你想要一个文本框。还是您要允许用户更改 ID?如果是这种情况,请发表评论。

      希望这会有所帮助。

      【讨论】:

      • 通常我使用 DataGridTextColumn 通过 Entity FrameWork 的用户导航来显示 FullName。当我更改组合框的选定项时,我希望更新数据网格值,但是当我这样做时,出现了更新问题。 bur 当我直接使用 proxyResponsibleUser_ID 时,它会自动更新,但在数据网格中显示 Id 值而不是 Fullname。所以我尝试了这样的代码sn-p。感谢您的帮助,但没有奏效。您能提出解决此类问题的方法吗?再次感谢你..
      • 不,我不想让任何人编辑该列,我错误地使用了它:p 现在我使用了 celltemplate
      • 在我看来是一个 EF 问题(在键和导航属性之间同步)。但很抱歉,我对 EF 一无所知,因此在这种情况下无法为您提供帮助。但是对于您写的问题,DataGridTemplateColumn 不需要知道绑定。所有特定于绑定的声明都在 DataTemplate/s 中完成。我会尝试问一个更具体的 EF 问题以获得比我更有价值的答案(我的答案只是 WPF 特有的)。
      猜你喜欢
      • 2013-07-02
      • 2017-01-16
      • 2019-05-09
      • 2012-07-04
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多