2015-12-01 1 views
2

У меня есть проблема, которая, как казалось, многие другие люди раньше. Я пытаюсь использовать стиль, который содержит GridView несколькими элементами управления.Просмотр не может быть предоставлен более чем одним Listview

Я искал в Интернете ответов и получил два решения:

  • Изменить StaticResource с DynamicResource
  • Использование х: общий = "False" на GridView

Я попробовал оба решения (даже в то же время), но ошибка все же появляется, как только я применяю стиль ко второму элементу управления.

Стиль выглядит следующим образом

<Style x:Key="MyCustomStyle" TargetType="{x:Type MyUserControl}" BasedOn="{StaticResource MyUserControlBaseStyle}"> 
    <Setter Property="Watermark" Value="{x:Static LabelResources.Caption}"/> 
    <Setter Property="ErrorText" Value="{Binding Converter={StaticResource FormatStringConverter}, ConverterParameter={x:Static LabelResources.Caption}}"/> 
    <Setter Property="LookupTemplate"> 
     <Setter.Value> 
      <DataTemplate DataType="{x:Type LookupResult}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" Margin="0,0,2,0"/> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 

    <Setter Property="SuggestionsView" Value="{DynamicResource CustomGridView}"/> 
</Style> 

и здесь GridView

<GridView x:Key="CustomGridView" x:Shared="False"> 
    <GridViewColumn Header="{x:Static resources:LabelResources.Name}" Width="Auto" HeaderContainerStyle="{DynamicResource GridViewHeaderStyle}"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" HorizontalAlignment="Left"/> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
    </GridViewColumn>    
</GridView> 

Что я могу сделать?

ответ

2

Похоже, что вы создали только один экземпляр CustomGridView, и вы пытаетесь присвоить его нескольким местам, что вызывает исключение.

Согласно MSDN page on x:Shared

В WPF, х: Общий действительна только при соблюдении следующих условий:

  • ResourceDictionary, который содержит элементы с й: Общим должны быть составлены , ResourceDictionary не может находиться в свободном XAML или использовать для тем.

  • ResourceDictionary, который содержит элементы, не должен быть вложен в другой ResourceDictionary. Например, вы не можете использовать x: общий для элементов в ResourceDictionary, который находится внутри стиля, который уже является элементом ResourceDictionary.

Я не совсем уверен, что это значит быть Составитель ResourceDictionary, но вы можете попробовать изменить Build Action на странице, а не ресурсов, как this answer suggests.

Если вы не можете получить х: Shared работает, то, возможно, рассмотреть вопрос о внесении SuggestionsView в ContentTemplate или DataTemplate вместо так каждое использование этого будет создать свой собственный GridView.

<ContentTemplate x:Key="CustomGridView"> 
    <GridView> 
     <GridViewColumn Header="{x:Static resources:LabelResources.Name}" Width="Auto" HeaderContainerStyle="{DynamicResource GridViewHeaderStyle}"> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}" HorizontalAlignment="Left"/> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn>    
    </GridView> 
</ContentTemplate> 
+0

Hi Rachel. Разве это не цель x: shared = "false", чтобы создать новый экземпляр GridView? SuggestionsView - это в основном класс, полученный из GridView, с некоторыми дополнительными функциями, которые позволяют мне добавлять динамически созданные столбцы. – StefanG

+0

@StefanG Да, но он работает только в том случае, если объект находится в скомпилированном ResourceDictionary. Он не будет работать, если это свободный XAML или в другом вложенном словаре. Как ваша настройка? – Rachel

+0

У меня есть ResourceDictionary со всеми моими стилями для этого элемента управления. Что значит «скомпилировано»? Есть ли специальный вариант для этого или это нормальное поведение при использовании ResourceDictionaries? – StefanG