簡體   English   中英

C#、WPF - 使用 ControlTemplate 和 Binding 時,ListView 的項目不會顯示

[英]C#, WPF - Items of ListView wont show when using ControlTemplate and Binding

我正在嘗試將自己構建的類的對象添加到帶有 GridView 的 ListView 中。 DataBinding 工作沒有任何問題,並且 Items 以正確的方式顯示得很好。 這是 ListView 的 StyleTemplate:

<Style x:Key="Orig_FileViewTemplate" TargetType="ListView">            
        <Setter Property="VerticalAlignment" Value="Stretch"></Setter>
        <Setter Property="HorizontalAlignment" Value="Stretch"></Setter>            
    </Style>
<Style x:Key="FileViewTemplate" BasedOn="{StaticResource Orig_FileViewTemplate}" TargetType="ListView">
                    <Setter Property="ItemContainerStyle" Value="{StaticResource FileViewItemContainerTemplate}"></Setter>
                    <EventSetter Event="SelectionChanged" Handler="SelectionChangedOnListView" />                        
                </Style>

這是我的 ListView-Objects 之一,它使用這種樣式:

<ListView Style="{DynamicResource FileViewTemplate}" Name="lv_FileSourceLV" Grid.Column="1" Grid.Row="0">
                                    <ListView.View>
                                        <GridView >
                                            <GridViewColumn Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,1'}">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Image MaxWidth="30" Margin="3,2,3,2" VerticalAlignment="Center" HorizontalAlignment="Center">
                                                            <Image.Style>
                                                                <Style TargetType="{x:Type Image}">
                                                                    <Style.Triggers>
                                                                        <DataTrigger Binding="{Binding IsFolder}" Value="True">
                                                                            <Setter Property="Source" Value="{StaticResource Folder_Icon }" />
                                                                        </DataTrigger>
                                                                        <DataTrigger Binding="{Binding IsFolder}" Value="False">
                                                                            <Setter Property="Source" Value="{StaticResource File_Icon }" />
                                                                        </DataTrigger>
                                                                    </Style.Triggers>
                                                                </Style>
                                                            </Image.Style>
                                                        </Image>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewNameColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,45'}" DisplayMemberBinding="{Binding Name }" />
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,175'}" DisplayMemberBinding="{Binding Size}" />
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewDateColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,275'}" DisplayMemberBinding="{Binding Date}" />
                                        </GridView>
                                    </ListView.View>
                                </ListView>

它像它應該的那樣工作,但現在我的問題......我的 GUI 上有大量這種類型的 ListViews,我試圖將整個樣式放入 ResourceManager 以使我的代碼更清晰並節省大量冗余代碼。 但是當我像這樣使用樣式時:

<Style x:Key="FileViewTemplate" BasedOn="{StaticResource Orig_FileViewTemplate}" TargetType="ListView">
                    <Setter Property="ItemContainerStyle" Value="{StaticResource FileViewItemContainerTemplate}"></Setter>
                    <EventSetter Event="SelectionChanged" Handler="SelectionChangedOnListView" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate  TargetType="{x:Type ListView}">
                                <ListView>
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,1'}">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Image MaxWidth="30" Margin="3,2,3,2" VerticalAlignment="Center" HorizontalAlignment="Center">
                                                            <Image.Style>
                                                                <Style TargetType="{x:Type Image}">
                                                                    <Style.Triggers>
                                                                        <DataTrigger Binding="{Binding IsFolder}" Value="True">
                                                                            <Setter Property="Source" Value="{StaticResource Folder_Icon }" />
                                                                        </DataTrigger>
                                                                        <DataTrigger Binding="{Binding IsFolder}" Value="False">
                                                                            <Setter Property="Source" Value="{StaticResource File_Icon }" />
                                                                        </DataTrigger>
                                                                    </Style.Triggers>
                                                                </Style>
                                                            </Image.Style>
                                                        </Image>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewNameColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,45'}" DisplayMemberBinding="{Binding Name}" />
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,175'}" DisplayMemberBinding="{Binding Size}" />
                                            <GridViewColumn HeaderContainerStyle="{DynamicResource FileViewDateColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,275'}" DisplayMemberBinding="{Binding Date}" />
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>

並以這種方式使用 ListView:

<ListView Style="{DynamicResource FileViewTemplate}" Name="lv_FileSourceLV" Grid.Column="1" Grid.Row="0"></ListView>

GUI 上的 ListView 將為空,即使我向其中添加了 Items 也是如此。 我以相同的方式添加它們:

lv_FileSourceLV.Items.Add(file)

我想我應該以不同的方式處理 DataBinding,當我在模板中使用它時,但我不知道如何。

你能告訴我我做錯了什么嗎? 先感謝您!

編輯:使用 GridView 資源,如

<GridView x:Key="FileViewGrid">

我現在收到此錯誤:

System.Windows.Markup.XamlParseException HResult=0x80131501
Message='設置屬性 'System.Windows.FrameworkElement.Style' 引發異常。 行號“331”和行位置“106”。 內部異常 1:InvalidOperationException:視圖不能被多個 ListView 共享。

這是我當前的代碼:

<DataTemplate x:Key="FileViewNameTemplate">
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
    <DataTemplate x:Key="FileViewSizeTemplate">
        <TextBlock Text="{Binding Size}"/>
    </DataTemplate>
    <DataTemplate x:Key="FileViewDateTemplate">
        <TextBlock Text="{Binding Date}"/>
    </DataTemplate>
    <DataTemplate x:Key="FileViewImageTemplate">
        <Image MaxWidth="30" Margin="3,2,3,2" VerticalAlignment="Center" HorizontalAlignment="Center">
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsFolder}" Value="True">
                            <Setter Property="Source" Value="{StaticResource Folder_Icon }" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding IsFolder}" Value="False">
                            <Setter Property="Source" Value="{StaticResource File_Icon }" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    </DataTemplate>
    <GridView x:Key="FileViewGrid" x:Shared="False">
            <GridViewColumn CellTemplate="{StaticResource FileViewImageTemplate}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,1'}" />
            <GridViewColumn CellTemplate="{StaticResource FileViewNameTemplate}" HeaderContainerStyle="{DynamicResource FileViewNameColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,45'}"/>
            <GridViewColumn CellTemplate="{StaticResource FileViewSizeTemplate}" HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,175'}"/>
            <GridViewColumn CellTemplate="{StaticResource FileViewDateTemplate}" HeaderContainerStyle="{DynamicResource FileViewDateColumn}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=ListView}, Converter={StaticResource percentageConverter}, ConverterParameter='0,275'}"/>
    </GridView>
    <Style x:Key="FileViewTemplate" BasedOn="{StaticResource Orig_FileViewTemplate}" TargetType="ListView">
        <Setter Property="ItemContainerStyle" Value="{StaticResource FileViewItemContainerTemplate}"></Setter>
        <EventSetter Event="SelectionChanged" Handler="SelectionChangedOnListView" />
        <Setter Property="View" Value="{DynamicResource FileViewGrid}"/>
    </Style>
    

我還嘗試將“x:Shared=False”屬性放到 GridView 和 Style 中,並將 GridView 直接放入“FileViewDateTemplate”的 View-Property 中。任何事情都沒有成功。

在 ListView 的 ControlTemplate 中有一個 ListView 是錯誤的。 您根本不應該設置Template屬性。

View屬性添加一個 setter,它使用共享的GridView資源 - 並且還可以選擇將 DataTemplate 設為資源。

您通常也不會以編程方式將元素添加到 ItemsControl 的Items集合。 在主視圖模型中應該有一個 ObservableCollection 屬性, ItemsSource屬性將綁定到該屬性。

<Window.Resources>
    <DataTemplate x:Key="MyCellTemplate">
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
    <GridView x:Key="MyGridView" x:Shared="False">
        <GridViewColumn Header="Name"
                        CellTemplate="{StaticResource MyCellTemplate}"/>
    </GridView>
    <Style x:Key="MyListViewStyle" TargetType="ListView">
        <Setter Property="View" Value="{StaticResource MyGridView}"/>
    </Style>
</Window.Resources>
<Grid>
    <ListView Style="{StaticResource MyListViewStyle}"
              ItemsSource="{Binding MyItems}"/>
</Grid>

編輯:共享樣式資源也應該工作:

<Style x:Key="MyListViewStyle" x:Shared="False" TargetType="ListView">
    <Setter Property="View">
        <Setter.Value>
            <GridView>
                <GridViewColumn Header="Name"
                    CellTemplate="{StaticResource MyCellTemplate}"/>
            </GridView>
        </Setter.Value>
    </Setter>
</Style>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM