2011-11-07 55 views
4

DataTemplate還有一個令人頭痛的問題。SL4。通過ElementName綁定在DataTemplate中不起作用


描述: 使用Silverlight 4,MVVM等(Silverlight的LOB應用非標準組開發工具)。

實體列表成功綁定到DataGrid。一個屬性(nullable bool BoolValue)負責實體行爲,並在圖片中顯示在數據網格中,單擊它們可以改變LayoutRoot元素中一些控件的可見性。

問題: 的問題在於,不幸或幸運的是,ElementNameDataTemplate結合不看到除了那些,被放置該模板內的其它元件。

代碼示例:

<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總是零。

在互聯網上有很多非常相似的問題和解決方案,但我還沒有找到任何解決這個問題的簡單而優雅的方法。

回答

6

請看看我在這個post答案。

元素名稱綁定在DataGrid內不起作用。你需要一個代理來解決這個問題。然而,ElementName綁定對於正常的DataTemplates,例如ItemTemplateListBox

+0

你的意思是說''DataGrid'模板中的'ElementName'沒有辦法綁定? –

+0

不,我不這麼認爲...... –

+0

在Dan Wahlin的例子中,我發現只有訪問'DataTemplate'中的ViewModel的方法,但在我的情況下使用'StaticResource'似乎工作正常。 –

1

[這應該是一個評論,但我超過了允許的字符數]

我看到兩種方法來解決這個問題:

  1. ContentControl繼承;添加將在兩種狀態之間切換的IsShowing屬性(布爾型);在新控件的控件模板中製作顯示和隱藏內容所需的動畫。
  2. 添加一個靜態類,該類將保存一個字典以保存對元素的引用;在元數據中添加一個帶有PropertyChangedCallback的附加屬性(bool) - 如果新值爲true:如果爲false,則將該元素(屬性所附屬的)添加到字典中:從字典中移除該元素;每個元素的關鍵是它的名字;該行爲將得到兩個字符串,它們是元素的名稱,並將在字典中查找它們。

兩種方式都是不那麼優雅,但是這Silverlight的... ;-)

+0

謝謝你的回答。有趣的方法。 –

相關問題