2009-08-10 42 views
2

我在使用CellTemplate/CellEditingTemplate时数据绑定对象的属性没有更新的DataGrid遇到问题:Silverlight:使用CellEditingTemplate时出现问题

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

我通过RIA服务绑定到代码生成的实体。我已经为PropertyChanged事件添加了一个事件处理程序,它永远不会被触发。但是,如果我不使用模板而是使用DataGridTextColumn,一切正常。

我确定这听起来像一个简单的修复 - 我只在我的编辑模板中使用TextBox,那么为什么我们不使用DataGridTextColumn?问题是我想要一个多行文本框,所以使用DataGridTextColumn不是一个选项。

有什么建议吗?您是否知道使用包含单个TextBox的CellEditingTemplate和使用DataGridTextColumn之间的任何差异?

谢谢,
-Charles

[更新]
我在这里发布了一个错误报告:
http://silverlight.net/forums/p/118729/267521.aspx

我无法想象这是“按照设计”。 ..如果其他人已经知道这件事并且我只是愚蠢,我会感激一个解释 - 我更喜欢尴尬而不是无知:)。

+0

+1:我一直有同样的问题。 – 2009-08-10 19:37:10

+0

如果您找到解决方案,请让我知道。这开始让我疯狂。如果我找到解决方案,我会确保更新。 – Charles 2009-08-10 19:46:15

+0

好吧,我找到了一个解决方案...... – Charles 2009-08-10 22:03:24

回答

0

我找到了解决办法,但我无法解释为什么它的确与众不同:

改变了...

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 

...这样的:

<data:DataGridTemplateColumn Header="Text"> 
    <data:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellTemplate> 
    <data:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Text, Mode=TwoWay}" /> 
     </DataTemplate> 
    </data:DataGridTemplateColumn.CellEditingTemplate> 
</data:DataGridTemplateColumn> 


请注意我如何在TextBlock的绑定上指定“Mode = OneWay”:

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 


我不知道为什么这应该有所作为。即使TextBlock设置为TwoWay,为什么不会对数据绑定对象进行任何更改?

一个解释将不胜感激......我花了大约五个小时对我的键盘猛撞我的头只是为了达到这一点,我想知道为什么这是我犯了这个错误(假设它不是Silverlight中的错误)。

感谢,
- 查尔斯

+0

根据您所看到的行为来判断,我会说XML节点按顺序处理,并且ctor签名被确定一次并缓存。 – 2010-07-17 07:47:47

0

我“嫌疑”问题出在文本框的Text属性的默认构造函数。

现在的Text属性是dependecyproperty,当你调用

<TextBlock Text="{Binding Text}" ></TextBlock> 

你实际要求,需要一个单一的字符串值,进而SL的Text属性的构造函数/ WPF使用反射来找出哪些构造是的,你可以通过在命名参数样式中使用它来避免这种情况。

<TextBlock Text="{Binding Path=Text}" ></TextBlock> 

我认为没有说明它实际上默认为一次性绑定的模式,这就是为什么OnPropertyChanged犯规影响值,因为结合只会发生一次。这看起来像下面。现在,文本框绑定的默认值是“OneWay”,也许因为它嵌套在数据网格中,其默认行为是不同的。也许它做属性继承的东西,并使用UI控件的绑定模式。

<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock> 

所以为什么当你指定喜欢的结合模式,

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock> 

它的工作原理,并愉快地容易

相关问题