C# MVVM WPF绑定在ListView上与ItemContainerStyle断开
当我将ItemContainerStyle应用于我的ListView(GridView)时,ItemSource绑定将显示对象名而不是对象值。本质上,当我应用容器样式时,绑定不再工作。我不明白为什么会出现这种情况,因为我仍然保留DisplayMemeberBinding到对象上的属性 下面是示例代码: 型号:C# MVVM WPF绑定在ListView上与ItemContainerStyle断开,c#,wpf,listview,mvvm,binding,C#,Wpf,Listview,Mvvm,Binding,当我将ItemContainerStyle应用于我的ListView(GridView)时,ItemSource绑定将显示对象名而不是对象值。本质上,当我应用容器样式时,绑定不再工作。我不明白为什么会出现这种情况,因为我仍然保留DisplayMemeberBinding到对象上的属性 下面是示例代码: 型号: public class Person { public string Name { get; set; } = "Randy Orton"; public int Age
public class Person
{
public string Name { get; set; } = "Randy Orton";
public int Age { get; set; } = 26;
public bool Employed { get; set; } = true;
public Person(string name, int age, bool employed)
{
Name = name;
Age = age;
Employed = Employed;
}
public Person()
{
}
}
视图模型:
public ObservableCollection<Person> People { get; set; }
public ViewModel()
{
People = new ObservableCollection<Person> { new Person(), new
Person(), new Person() };
}
xaml:
要修复此问题,只需将ContentPresenter
更改为GridViewRowPresenter
控件模板内的在ListViewItem控件模板中有一个普通的
。它对DisplayMemberBinding一无所知。在替换ControlTemplate时,还不清楚GridView将如何工作。你不再有专栏了,是吗?我还有专栏。如果您删除ItemContainerStyle,此代码将完全按照我的预期工作。各个项目中没有列,只有一个文本包含ContentPresenter默认的操作,即Person.ToString()的结果。请给我一个代码示例,说明如何解决此问题。请查看以查看是否存在GridViewRowPresenter而不是ContentPresenter。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
<Style x:Key="listviewitemStyle"
TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="HighlightTextBrushKey"
Color="Black" />
<SolidColorBrush x:Key="HighlightBrushKey"
Color="#7d7d7d" />
<SolidColorBrush x:Key="HighlightMouseOverBrushKey"
Color="{Binding Source={StaticResource HighlightBrushKey}, Path=Color}"
Opacity="0.3" />
<SolidColorBrush x:Key="disabledTextBrushKey"
Color="#303030" />
<SolidColorBrush x:Key="disabledBrushKey"
Color="#595959" />
</Style.Resources>
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"
Margin="{TemplateBinding Margin}">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightMouseOverBrushKey}" />
<Setter Property="Foreground" Value="{StaticResource HighlightTextBrushKey}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource HighlightBrushKey}" />
<Setter Property="Foreground" Value="{StaticResource HighlightTextBrushKey}" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" Value="{StaticResource disabledBrushKey}" />
<Setter Property="Foreground" Value="{StaticResource disabledTextBrushKey}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</Window.Resources>
<Grid>
<ListView
ItemsSource="{Binding People, UpdateSourceTrigger=PropertyChanged}"
ItemContainerStyle="{StaticResource listviewitemStyle}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="auto" DisplayMemberBinding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
<GridViewColumn Header="Age" Width="auto" DisplayMemberBinding="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
<GridViewColumn Header="Employed" Width="auto" DisplayMemberBinding="{Binding Employed, UpdateSourceTrigger=PropertyChanged}" />
</GridView>
</ListView.View>
</ListView>
</Grid>