[英]MVVM WPF binding broken with ItemContainerStyle on ListView
当我将 ItemContainerStyle 应用到我的 ListView (GridView) 时,ItemSource 绑定显示对象名称而不是对象值。 本质上,当我应用容器样式时,绑定不再起作用。 我不明白为什么会这样,因为我仍然保留 DisplayMemeberBinding 到对象的属性。
这是示例代码:
模型:
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() };
}
看法:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
xml:
<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>
要解决此问题,只需将 ControlTemplate 中的ContentPresenter
更改为GridViewRowPresenter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.