SL4。 ElementName绑定在DataTemplate中不起作用

时间:2011-11-07 20:50:54

标签: silverlight xaml binding datagrid datatemplate

DataTemplate还有另一个令人头痛的问题。


说明 使用Silverlight 4,Mvvm等(适用于Silverlight LOB应用程序的标准开发人员工具集)。

实体列表已成功绑定到DataGrid。一个属性(可空的bool BoolValue)负责实体行为,并在datagrid中显示图片,单击这将导致更改LayoutRoot元素中某些控件的可见性。

问题: 问题是,不幸或幸运的是,ElementName内的 DataTemplate绑定没有看到除此之外的其他元素。

代码示例:

<navigation:DataGridTemplateColumn Width="40"
                              CanUserReorder="True"
                              CanUserSort="False">
     <navigation:DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
             <Border Background="GhostWhite">
             <Grid>
              <Image x:Name="ImageWithTrigger"
                     Grid.Column="1"
                     Margin="10,4,0,0"
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Cursor="Hand"
                     Source="images/someImage.png"
                     Stretch="None"
                     Visibility={Binding BoolValue, Converter={StaticResource boolToVisibilityConverter} }>
               <i.Interaction.Triggers>
                 <i:EventTrigger EventName="MouseLeftButtonDown">
                     <AttachedBehaviors:TrickyBehavior FrameworkElementToHide="{Binding ElementName=FirstControlOutside}" 
                                                       FrameworkElementToShow="{Binding ElementName=SecoundControlOutside}"/>
                 </i:EventTrigger>
              </i:Interaction.Triggers>
            </Grid>
            </Border>
          </DataTemplate>
     </navigation:DataGridTemplateColumn.CellTemplate>
</navigation:DataGridTemplateColumn>

在上面的示例中,FrameworkElementToHide和FrameworkElementToShow始终为null。

互联网上有很多非常类似的问题和解决方案,但我没有找到解决这个问题的任何简单而优雅的方法。

2 个答案:

答案 0 :(得分:6)

请在post中查看我的回答。

ElementName绑定在DataGrid内无效。您需要一个代理来解决这个问题。但是,ElementName绑定适用于普通DataTemplates,例如ItemTemplate的{​​{1}}等等。

答案 1 :(得分:1)

[这应该是评论,但我超出了允许的字符数]

我认为有两种方法可以解决这个问题:

  1. 继承自ContentControl;添加将在两个状态之间切换的IsShowing属性(bool);在新控件的控件模板中,制作用于显示和隐藏内容的所需动画。
  2. 添加一个静态类,该类将包含一个字典以保存对元素的引用;在元数据中添加带有PropertyChangedCallback的附加属性(bool) - 如果新值为true:将元素(属性附加到的元素)添加到字典中,如果为false:从字典中删除元素;每个元素的关键是它的名字;该行为将获得两个字符串,这些字符串是元素的名称,并将在字典中查找它们。
  3. 两种方式都不是那么优雅,但那是Silverlight ......; - )