如何解决C#,WPF-使用ControlTemplate和Binding时不会显示ListView的项目
我试图将自己构建的类的对象添加到具有GridView的ListView中。 DataBinding正常工作,并且项目显示正确且正确。 这是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对象之一,它使用以下样式:
<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,45'}" DisplayMemberBinding="{Binding Name }" />
<GridViewColumn HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth,175'}" DisplayMemberBinding="{Binding Size}" />
<GridViewColumn HeaderContainerStyle="{DynamicResource FileViewDateColumn}" Width="{Binding Path=ActualWidth,275'}" DisplayMemberBinding="{Binding Date}" />
</GridView>
</ListView.View>
</ListView>
它按应有的方式工作,但现在是我的问题...。 我的GUI上有大量此类ListView,我试图将整个样式放入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,45'}" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth,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>
即使我向其中添加项目,ListView在GUI上也将为空。 我将两种添加方式相同:
lv_FileSourceLV.Items.Add(file)
当我在模板中使用DataBinding时,我应该以不同的方式处理它,但我不知道如何。
你能告诉我我做错了吗? 预先谢谢你!
编辑:使用类似GridView的资源
<GridView x:Key="FileViewGrid">
我现在收到此错误:
System.Windows.Markup.XamlParseException HResult = 0x80131501
Message ='Set属性'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" 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,1'}" />
<GridViewColumn CellTemplate="{StaticResource FileViewNameTemplate}" HeaderContainerStyle="{DynamicResource FileViewNameColumn}" Width="{Binding Path=ActualWidth,45'}"/>
<GridViewColumn CellTemplate="{StaticResource FileViewSizeTemplate}" HeaderContainerStyle="{DynamicResource FileViewSizeColumn}" Width="{Binding Path=ActualWidth,175'}"/>
<GridViewColumn CellTemplate="{StaticResource FileViewDateTemplate}" HeaderContainerStyle="{DynamicResource FileViewDateColumn}" Width="{Binding Path=ActualWidth,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>
我还尝试将GridView和Style的属性设置为“ x:Shared = False”,然后将GridView直接置于“ FileViewDateTemplate”的视图属性中。任何不成功的事情。
解决方法
在ListView的ControlTemplate中具有ListView是错误的。您根本不应设置Template
属性。
改为为View
属性添加一个设置器,该设置器使用共享的GridView
资源-并有选择地还将DataTemplate设置为资源。
您通常也不会以编程方式将元素添加到ItemsControl的Items
集合中。相反,在主视图模型中应该绑定ItemsSource
属性的ObservableCollection属性。
<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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。