View不能由多个Listview共享

时间:2015-12-01 15:15:30

标签: wpf listview styles share

我有一个问题,似乎很多其他人以前有过。我尝试使用一个样式,它包含几个控件的GridView。

我在网上搜索了答案并得到了两个解决方案:

  • 使用DynamicResource更改StaticResource
  • 在GridView上使用x:shared =“False”

我尝试了两种解决方案(即使是在同一时间),但只要我将样式应用于第二个控件,错误仍然会出现。

样式看起来像这样

<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>

我该怎么办?

1 个答案:

答案 0 :(得分:3)

听起来您只创建了一个CustomGridView个实例,并且您正在尝试将其分配到多个位置,这会导致异常。

根据MSDN page on x:Shared

  

在WPF中,x:Shared仅在以下条件下有效:

     
      
  • 包含x:Shared项目的ResourceDictionary必须编译。 ResourceDictionary不能在松散的XAML中使用或使用   主题。

  •   
  • 包含项目的ResourceDictionary不得嵌套在另一个ResourceDictionary中。例如,你不能使用   x:在StyleDictionary中的一个Style内共享   已经是ResourceDictionary项目。

  •   

我不完全确定成为Compiled ResourceDictionary的含义,但您可以尝试将Build Action更改为Page而不是Resource,例如this answer suggests

如果你无法获得x:共享工作,那么可以考虑将SuggestionsView设为ContentTemplateDataTemplate,以便每次使用它都会创建自己的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>