2014-06-21 97 views
1

我正在使用Windows應用商店應用。一個頁面包含一個ListView有一些TextBlocks和三個按鈕的StackPanel我可以將按鈕的可見性綁定到其包含ItemTemplate的IsSelected屬性嗎?

enter image description here

我想有三個按鈕是可見的,只有當ListItem它們所屬的選擇。我試過按鈕的Visibility屬性上Binding的所有可能安排,但迄今爲止沒有任何工作。看起來WinRT應用程序的約束綁定類型集阻止了我使用已知的解決方案。有什麼我可以做的嗎?

我目前正試圖從操縱事件處理程序中的代碼中的對象的角度來思考它,但沒有任何結果。

這裏是ItemTemplate中的XAML:

<ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel FlowDirection="LeftToRight" Orientation="Horizontal"> 
        <StackPanel Style="{StaticResource SessionBlock}" DoubleTapped="StackPanel_DoubleTapped"> 
         <TextBlock Style="{StaticResource SessionTitle}" Text="{Binding Title}" /> 
         <TextBlock Style="{StaticResource SessionStepCount}"> 
          <Run Text="{Binding StepsCount}" /> 
          <Run Text=" Steps" /> 
         </TextBlock> 
        </StackPanel> 
        <Button Content="&#xE17E;&#xE102;" 
          Style="{StaticResource ActionButton}" /> 
        <Button Content="&#xE17E;&#xE104;" 
          Style="{StaticResource ActionButton}" /> 
        <Button Content="&#xE17E;&#xE107;" 
          Style="{StaticResource ActionButton}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 

回答

1

您可以利用TemplatedParent爲同一

與申報一個布爾開始的知名度轉換器在資源

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 

然後在xaml中應用以下結合能見度,上述聲明的轉換器

Visibility="{Binding TemplatedParent.IsSelected,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibilityConverter}}" 

所以這裏的關鍵是要找到它的內容演示,然後它的TemplatedParent這是一個ListViewItem和IsSelected屬性的DataTemplate中的TemplatedParent是你在找什麼

所以你的例子可能是如下

<ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel FlowDirection="LeftToRight" Orientation="Horizontal"> 
       <StackPanel Style="{StaticResource SessionBlock}" DoubleTapped="StackPanel_DoubleTapped"> 
        <TextBlock Style="{StaticResource SessionTitle}" Text="{Binding Title}" /> 
        <TextBlock Style="{StaticResource SessionStepCount}"> 
         <Run Text="{Binding StepsCount}" /> 
         <Run Text=" Steps" /> 
        </TextBlock> 
       </StackPanel> 
       <Button Content="&#xE17E;&#xE102;" 
         Style="{StaticResource ActionButton}" 
         Visibility="{Binding TemplatedParent.IsSelected,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibilityConverter}}" /> 
       <Button Content="&#xE17E;&#xE104;" 
         Style="{StaticResource ActionButton}" 
         Visibility="{Binding TemplatedParent.IsSelected,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibilityConverter}}" /> 
       <Button Content="&#xE17E;&#xE107;" 
         Style="{StaticResource ActionButton}" 
         Visibility="{Binding TemplatedParent.IsSelected,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibilityConverter}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 

例如,在上面我申請的同一對所有三個按鈕,你也可以把所有的人都在一個堆疊面板和應用單一結合這麼縮短鱈魚即

+0

我做了這個改變,但現在我的應用程序崩潰,當我嘗試啓動它。看起來文檔暗示TemplatedParent可能只能在ControlTemplate而不是DataTemplate中使用? –

+0

崩潰不是綁定錯誤的正常行爲,錯誤時它不起作用。我成功地能夠在這裏綁定相同的。順便說一句,你有什麼異常,你可以注意到?是否有可能發佈工作示例?可以給我看看。 – pushpraj

+0

沒有例外。這很奇怪,但客觀上,程序停止運行並且Visual Studio顯示它不再調試。我對WinRT的各種XAML中的有限綁定功能感到非常沮喪。我非常感謝你提供了一個關於正在運行的示例的細節,但我不確定我是否想要發佈我的應用程序的所有源代碼,並且僅提取一個子集以使此屏幕可以正常工作並不容易。 –

-1

我從來沒有能夠通過XAML找到我想要的方式,但是我能夠用一些代碼隱藏來實現它。令人遺憾的是,代碼隱藏的內容非常模糊,需要一些幸運和勤奮的Google-fu來找到這樣做的咒語。這個真正的榮譽屬於這個博客頁面:http://blogs.msdn.com/b/wpfsdk/archive/2007/04/16/how-do-i-programmatically-interact-with-template-generated-elements-part-ii.aspx

我所做的就是,我添加的代碼稍加修改的版本,從博客頁面:

private List<childItem> findVisualChildren<childItem>(DependencyObject obj) where childItem : DependencyObject { 
    List<childItem> results = new List<childItem>(); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
     if (child != null && child is childItem) { 
      results.Add((childItem)child); 
     } else { 
      results.AddRange(findVisualChildren<childItem>(child)); 
     } 
    } 

    return results; 
} 

它遞歸搜索一個視覺的孩子元素給定類型的元素,並將它們全部返回到列表中。整潔,但這一切都不像喋喋不休嗎? Win Forms至少提供了一種非常明顯的與子節點交互的方法。

然後,方法是從ListViewSelectionChanged事件處理程序中調用:

private void SessionsList_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    for (int itemIdx = 0; itemIdx < SessionsList.Items.Count; itemIdx++) { 
     ListViewItem eachItem = (ListViewItem)SessionsList.ContainerFromIndex(itemIdx); 
     // Content Presenter stuff is from the blog post. I have no idea. 
     var presenters = findVisualChildren<ContentPresenter>(eachItem); 
     if (presenters != null && presenters.Count > 0) { 
      var buttonsList = findVisualChildren<Button>(presenters[0]); 
      if (buttonsList != null && buttonsList.Count > 0) { 
       for (int buttonIdx = 0; buttonIdx < buttonsList.Count; buttonIdx++) { 
        Button eachButton = (Button)buttonsList[buttonIdx]; 
        if (itemIdx == SessionsList.SelectedIndex) { 
         eachButton.Visibility = Visibility.Visible; 
        } else { 
         eachButton.Visibility = Visibility.Collapsed; 
        } 
       } 
      } 
     } 
    } 
} 

所以你可以看到,處理程序遍歷在ListView每個項目。對於每一個,它抓住ContentPresenter無論如何。然後它使用該對象上的findVisualChildren來查找屬於它的所有按鈕。如果正在對當前選定的項目進行操作,則可以看到按鈕;否則,它們會崩潰。

它的工作原理與我想要的完全一樣,但我不禁感到失望,因爲我無法找到正確的綁定咒語來以正確的方式做到這一點。

我是否認爲WPF的WinRT版本具有嚴重癱瘓的綁定功能?這似乎與WPF提供的適用於我的非Store應用程序的應用程序相差甚遠。

相關問題