Silverlight:使用CellEditingTemplate时出现问题

时间:2009-08-10 18:57:28

标签: c# silverlight silverlight-3.0

在使用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

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

2 个答案:

答案 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>

它快乐而轻松地工作