Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net Wpf 4 DataGrid列绑定问题_.net_Wpf_Binding_Wpfdatagrid - Fatal编程技术网

.net Wpf 4 DataGrid列绑定问题

.net Wpf 4 DataGrid列绑定问题,.net,wpf,binding,wpfdatagrid,.net,Wpf,Binding,Wpfdatagrid,我创建了一个datagrid,其中列绑定到一个可观察的集合。除了绑定到我的业务对象中可为空的十进制属性的列之外,所有这些都可以正常工作 如果我使用 <DataGridTextColumn Binding="{Binding Path=BaseUnitCostValue}" Header="Unit Cost Value" MinWidth="100" /> 然而,由于我的列定义都能很好地工作,因为我最终希望它是一个复杂的列,所以我尝试使用DatagridTemplateColu

我创建了一个datagrid,其中列绑定到一个可观察的集合。除了绑定到我的业务对象中可为空的十进制属性的列之外,所有这些都可以正常工作

如果我使用

<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时那样


谢谢

可能是因为您试图在非编辑模板中为文本块进行双向绑定:

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

试着把它改成单向的,也许它能起作用。还要删除触发器语句


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

这是我的业务模型中的问题

我不得不改变我的财产

 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
公共属性BaseUnitCostValue是否为十进制?
得到
返回_BaseUnitCostValue
结束
设置(ByVal值是否为十进制?)
如果BaseUnitCostValue值,则
_BaseUnitCostValue=值
Me.DataStateChanged(“BaseUnitCostValue”)
Me.DataStateChanged(“TotalBaseUnitCostValue”)
如果结束
端集
端属性

公共属性BaseUnitCostValue是否为十进制?
得到
返回_BaseUnitCostValue
结束
设置(ByVal值是否为十进制?)
如果(非_BaseUnitCostValue.HasValue)或(非_BaseUnitCostValue.HasValue)或(非_BaseUnitCostValue)或(非_BaseUnitCostValue)
_BaseUnitCostValue=值
Me.DataStateChanged(“BaseUnitCostValue”)
Me.DataStateChanged(“TotalBaseUnitCostValue”)
如果结束
端集
端属性

问题就解决了。多亏了HCL,在一个简单的转换器中设置断点的想法向我表明,该属性从未真正更新过。

您是否在代码背后绑定数据网格?如果是,使用哪个源?不幸的是,从textblock中删除mode=TwoWay和UpdateSourceTrigger=PropertyChanged没有区别,并且输出窗口中没有相关消息?a)尝试将TextBox声明为默认模板,而不声明编辑模板时会发生什么情况。b) 创建并附加一个值转换器,它只返回输入值。在转换器中设置断点以查看发生了什么。不,输出窗口中也没有任何内容。如果我将绑定属性更改为decimal而不是nullable decimal,则上述celltemplates可以正常工作,但我需要该属性为nullable。该值持续存在,但从未调用转换器?。
 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