【问题标题】:Silverlight: Problem using CellEditingTemplateSilverlight:使用 CellEditingTemplate 时出现问题
【发布时间】:2009-08-10 18:57:27
【问题描述】:

我在使用 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 之间的区别吗?

谢谢,
-查尔斯

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

我无法想象这是“按设计”...如果其他人知道这一点而我只是愚蠢,我会很感激解释 - 我宁愿尴尬而不是无知 :) .

【问题讨论】:

  • +1:我也遇到了同样的问题。
  • 如果您找到解决方案,请告诉我。这开始让我发疯了。如果找到解决方案,我会确保更新此内容。

标签: c# silverlight silverlight-3.0


【解决方案1】:

我找到了解决方案,但我无法解释为什么会有所作为:

改变这个...

<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 中的错误)。

谢谢,
-查尔斯

【讨论】:

  • 从您所看到的行为来看,我会说 XML 节点是按顺序处理的,并且 ctor 签名被确定一次并被缓存。
【解决方案2】:

i "suspect" 问题出在文本框的 Text 属性的默认构造函数上。

现在 Text 属性是一个依赖属性,当您调用时

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

它工作愉快且轻松

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多