Wpf 4 DataGrid列绑定问题

时间:2010-09-10 12:17:42

标签: .net wpf binding wpfdatagrid

我创建了一个数据网格,其中列绑定到一个可观察的集合。除了从业务对象绑定到可以为空的十进制属性的列之外,一切都很好。

如果我使用

<DataGridTextColumn Binding="{Binding Path=BaseUnitCostValue}" Header="Unit Cost Value" MinWidth="100" />

因为我的列定义一切正常,但是,我最终希望它是一个复杂的列,我尝试使用DatagridTemplateColumn这样

<DataGridTemplateColumn Header="Unit Cost Value" MinWidth="100">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但是,使用这个列配置,虽然我可以在完成对单元格的编辑后立即输入值,但它的值会消失。

我也尝试使用转换器转换为字符串并再次返回可以为空的小数,但没有运气。

我强烈怀疑这是因为它被绑定到可以为空的小数。我需要对cellTemplates做些什么,以便正确绑定值,就像使用标准DataGridTextColumn一样吗?

由于

2 个答案:

答案 0 :(得分:1)

也许是因为你试图在非编辑模板中对TextBlock进行双向绑定:

 <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
            <TextBlock Text="{Binding BaseUnitCostValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextAlignment="Right"/> 
        </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 

尝试将其更改为单向,然后可以正常工作。同时删除Trigger语句。

如果没有帮助,请查看输出窗口,如果看到相关消息。

答案 1 :(得分:0)

这是我的商业模式中的问题。

我必须从

改变我的财产
 Public Property BaseUnitCostValue As Decimal?
        Get
            Return _BaseUnitCostValue
        End Get
        Set(ByVal value As Decimal?)
            If _BaseUnitCostValue <> value Then
                _BaseUnitCostValue = value
                Me.DataStateChanged("BaseUnitCostValue")
                Me.DataStateChanged("TotalBaseUnitCostValue")
            End If

        End Set
    End Property

 Public Property BaseUnitCostValue As Decimal?
        Get
            Return _BaseUnitCostValue
        End Get
        Set(ByVal value As Decimal?)
            If (Not _BaseUnitCostValue.HasValue) OrElse (Not value.HasValue) OrElse _BaseUnitCostValue <> value Then
                _BaseUnitCostValue = value
                Me.DataStateChanged("BaseUnitCostValue")
                Me.DataStateChanged("TotalBaseUnitCostValue")
            End If

        End Set
    End Property

问题消失了。感谢HCL,因为在一个简单的转换器中断点的想法告诉我该属性从未实际更新过。