ListView绑定显示模型而非属性问题(MaterialDesign样式冲突)
问题解决:ListView继承MaterialDesign样式后显示对象而非属性
问题原因
直接继承MaterialDesignListBoxItem样式会覆盖ListViewItem默认的模板,导致GridView的列绑定失效,ListView转而显示模型对象的ToString()结果。另外你的XAML代码里TargetType属性存在语法错误,正确写法应为TargetType="{x:Type ListViewItem}"。
解决方案
方案1:使用MaterialDesign专门的ListViewItem样式
如果MaterialDesign提供了MaterialDesignListViewItem静态资源(多数版本都包含),直接继承这个样式即可,它是为ListViewItem适配的:
<ListView ItemsSource="{Binding LinkedProject.LinkedAutomateListVM.Automates}" Margin="8"> <ListView.ItemContainerStyle> <Style BasedOn="{StaticResource MaterialDesignListViewItem}" TargetType="{x:Type ListViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Designation}" Header="Designation" /> <GridViewColumn DisplayMemberBinding="{Binding IpAddress}" Header="IP Address" /> </GridView> </ListView.View> </ListView>
方案2:基于默认ListViewItem样式扩展MaterialDesign效果
如果没有专门的ListViewItem样式,可继承默认ListViewItem样式,手动添加MaterialDesign的视觉属性:
<ListView ItemsSource="{Binding LinkedProject.LinkedAutomateListVM.Automates}" Margin="8"> <ListView.ItemContainerStyle> <Style BasedOn="{StaticResource {x:Type ListViewItem}}" TargetType="{x:Type ListViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> <!-- MaterialDesign基础样式属性 --> <Setter Property="Foreground" Value="{DynamicResource MaterialDesignBody}"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Padding" Value="8,4"/> <Setter Property="BorderThickness" Value="0"/> <!-- 选中状态样式 --> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource MaterialDesignSelection}"/> <Setter Property="Foreground" Value="{DynamicResource MaterialDesignSelectionForeground}"/> </Trigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Designation}" Header="Designation" /> <GridViewColumn DisplayMemberBinding="{Binding IpAddress}" Header="IP Address" /> </GridView> </ListView.View> </ListView>
内容的提问来源于stack exchange,提问作者AsLose
相关产品推荐
相关产品推荐

