在使用CellTemplate / CellEditingTemplate时,DataGrid遇到数据绑定对象属性未更新的问题:
<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
[UPDATE]
我在这里发布了一个错误报告:
http://silverlight.net/forums/p/118729/267521.aspx
我无法想象这是“按照设计的”......如果其他人已经知道这一点并且我只是愚蠢,我会欣赏一个解释 - 我更喜欢尴尬而不是无知:)
答案 0 :(得分: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中的错误。)
谢谢,
-Charles
答案 1 :(得分:0)
我“怀疑”问题在于文本框的Text属性的默认构造函数。
现在,当您调用
时,Text属性是dependecyproperty <TextBlock Text="{Binding Text}" ></TextBlock>
你实际上调用Text属性的构造函数,该属性接受一个字符串值,而SL / WPF使用反射来确定它是哪个构造函数,你可以通过在命名参数样式中使用它来避免这种情况。
<TextBlock Text="{Binding Path=Text}" ></TextBlock>
我认为通过不指定实际默认为一次性绑定的模式,这就是为什么OnPropertyChanged不会影响该值,因为绑定只发生一次。哪种看起来像下面。现在文本框绑定的默认值是“OneWay”,可能因为它嵌套在数据网格中,它的默认行为是不同的。也许它在做属性继承的事情,并使用UI控件的绑定模式。
<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock>
因此,当您指定绑定模式时,为什么
<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>
它快乐而轻松地工作