[英]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.