2015-12-21 42 views
1

我需要一個ItemsView的ItemsPanel模板依賴於屬性IsClusterSupported的ItemsControl。 如果沒有ScrollViewer,ItemsControl將始終顯示正確的ItemsPanel,但是當我添加滾動查看器代碼時,即使IsClusterSupported = False,也會顯示ClusterMapItemsPanelTemplate。itemtemplate周圍的滾動查看器撿起錯誤的itemstemplate

這裏可能會發生什麼問題?我附上了下面的代碼。

<Grid Name="MapGrid"> 
    <ScrollViewer> 
     <ScrollViewer.Style> 
      <Style TargetType="{x:Type ScrollViewer}"> 
       <Setter Property="VerticalScrollBarVisibility" Value="Hidden"/> 
       <Setter Property="HorizontalScrollBarVisibility" Value="Hidden"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsScrollingSupported}" Value="True"> 
         <Setter Property="VerticalScrollBarVisibility" Value="Auto"/> 
         <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ScrollViewer.Style> 
     <ItemsControl Name="ItemsControlInnerMap" Loaded="ItemsControlInnerMap_Loaded" 
       ItemsSource="{Binding ItemsCol}" Tag="{Binding IsClusterSupported, PresentationTraceSources.TraceLevel=High}"> 
      <ItemsControl.Style> 
       <Style TargetType="{x:Type ItemsControl}"> 
        <Setter Property="ItemsPanel" Value="{StaticResource MapItemsPanelTemplate}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsClusterSupported}" Value="True"> 
          <Setter Property="ItemsPanel" Value="{StaticResource ClusterMapItemsPanelTemplate}"/> 
          <Setter Property="ItemContainerStyle" Value="{StaticResource ClusterMapGridContainerStyle}"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ItemsControl.Style> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border> 
        <TextBlock Text="{Binding LabelTxt}"/> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 

      <ItemsControl.GroupStyle> 
       <GroupStyle x:Name="MyGroup"> 

        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate> 
             <Border Name="BD" BorderBrush="Black" BorderThickness="2"> 
              <ItemsPresenter Name="ClusterPresenter" Tag="{Binding Name}"/> 
             </Border> 
             <ControlTemplate.Triggers> 
              <DataTrigger Binding="{Binding Name, Converter={StaticResource BorderVisibilityConvertor}}" Value="false"> 
               <Setter TargetName="BD" Property="BorderBrush" Value="Transparent"/> 
              </DataTrigger> 
             </ControlTemplate.Triggers> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
          <!--http://stackoverflow.com/questions/17863271/wpf-using-grid-as-itemshost-stacking-multiple-items-in-single-cell-automatical--> 
          <Setter Property="Grid.Row" Value="{Binding Items[0].ClusterGridRow}"/> 
          <Setter Property="Grid.Column" Value="{Binding Items[0].ClusterGridColumn}"/> 
          <Setter Property="Margin" Value="5"/> 
         </Style> 
        </GroupStyle.ContainerStyle> 

        <GroupStyle.Panel> 
         <ItemsPanelTemplate> 
          <Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
            Loaded="ClusterMapGrid_Loaded" 
            MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}" 
            MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}"> 
          </Grid>ReqMinHeight 
         </ItemsPanelTemplate> 
        </GroupStyle.Panel> 

       </GroupStyle> 
      </ItemsControl.GroupStyle> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 

RDV(2016年1月4日):我發現這裏一些有趣的事情,希望越來越接近解決方案,但仍然需要幫助。

  1. 我所有的綁定工作正常;我用&調試沒有scrollviewer,並在ItemsControl中看到正確的ItemsPanel。 ItemsControl的IsGrouping屬性也設置正確。

  2. 當我在ItemsControl附近有一個滾動查看器時,ClusterMapGrid(GroupStyle.Panel)會被加載而不管我有沒有集羣。一旦加載,非集羣模板(MapsItemsPanelTemplate)不會被加載。

  3. 爲了解決這個問題,我嘗試將ClusterMapGrid可見性綁定到ItemsControl的IsGrouping屬性,但是又一次以某種方式將ClusterMapGrid加載到scrollviewer的情況下,並且一旦加載,非集羣模板加載失敗。

  4. 我用snoop來檢查ClusterMapGrid的可見性,我可以看到它已經崩潰了,但是如果手動將它改爲snoop爲任何其他值,非集羣模板加載並且一切正常。我嘗試將可見性設置爲在ClusterMapGrid_Loaded事件中摺疊,但它也沒有幫助。

  5. 進一步的調試我發現ScrollViewer正在加載其中的所有項目 - 因此ClusterMapGrid被加載,一旦我使用Snoop更改可見性,在非羣集情況下它將被卸載。

問題聲明:如何在加載ClusterMapGrid後卸載它,我知道這是非集羣方案。

+0

將設置' 「ItemsControl」上的DataContext顯式工作? '' – Kcvin

+0

另外,請查看輸出窗口中的任何綁定/應用程序錯誤並更新問題以告訴我們它們是什麼如果有的話。 – Kcvin

+0

我驗證了(使用snoop並附加一個調試器),根據IsClusterSupported值正確設置ItemsControl的Tag屬性。出於某種原因,PresentationTraceSources.TraceLevel = High不起作用。 – RDV

回答

0

問題是,ScrollViewer初始化時加載了所有XAML中的所有內容,即使它並不打算加載(例如,如果GroupController上的IsGrouping屬性爲true,但應該加載GroupStyle.Panel,但使用scrollviewer時,它會加載)。

解決方案:從XAML註釋掉GroupStyle.Panel和它的資源添加爲ItemsPanelTemplate:

<ItemsPanelTemplate x:Key="ClusterPanelTemplate"> 
       <Grid Name="ClusterMapGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"                  
         Loaded="ClusterMapGrid_Loaded" 
         MaxHeight="{Binding AllowedMaxHeight}" MaxWidth="{Binding AllowedMaxWidth}" 
         MinHeight="{Binding ReqMinHeight}" MinWidth="{Binding ReqMinWidth}"/> 
    </ItemsPanelTemplate> 

添加以下的ItemsControlInnerMap_Loaded事件代碼隱藏:

private void ItemsControlInnerMap_Loaded(object sender, RoutedEventArgs e) 
     { 
      if ((sender as ItemsControl).IsGrouping) 
      { 
       (sender as ItemsControl).GroupStyle[0].Panel = (ItemsPanelTemplate)this.FindResource("ClusterPanelTemplate"); 
      } 
      else 
      { 
       (sender as ItemsControl).GroupStyle.Clear(); 
      } 
     }