SL4. Binding by ElementName 在 DataTemplate 中无法工作

4

在使用Silverlight 4,Mvvm等(Silverlight LOB应用程序的标准开发工具集)过程中,DataTemplate又成为了一个令人头疼的问题。


描述:实体列表已成功绑定到DataGrid,其中一个属性(可空bool BoolValue)负责实体行为,并在datagrid中呈现为图片。点击图片会更改LayoutRoot元素中某些控件的可见性。

问题:不幸的是或幸运的是,DataTemplate内的ElementName绑定只能看到该模板内部包含的元素,无法看到其他元素。

代码示例:

<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个回答

6
请查看我在此帖子中的回答:post
在DataGrid中,ElementName绑定不起作用。您需要使用代理来解决此问题。但是,在普通的DataTemplates中(例如ListBox的ItemTemplate等),ElementName绑定确实起作用。

你的意思是在DataGrid模板内部无法通过ElementName进行绑定吗? - Anatolii Gabuza
在Dan Wahlin的例子中,我只找到了在DataTemplate内访问ViewModel的方法,但是在我的情况下使用StaticResource似乎也可以正常工作。 - Anatolii Gabuza

1

[这应该是一条注释,但我超过了允许的字符数]

我看到解决这个问题有两种方法:

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

这两种方法都不太优雅,但这就是 Silverlight ... ;-)


谢谢你的回答。有趣的方法。 - Anatolii Gabuza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接