C# WPF Gridview复选框列标题MVVM
我仍然在思考整个MVVM模式,但在尝试为Gridview创建一个复选框列之前,我认为我已经很好地掌握了它。我需要用户能够选择列出的所有项目(通过标题复选框)或选择单独列出的项目。我将复选框的IsChecked属性数据绑定到viewmodel上的两个布尔字段。单元格模板上的复选框按预期工作,并触发属性更改事件。标题不起任何作用。我错过了什么。这对我来说还是新鲜事,所以要温柔。还有,如果有什么事情我应该做,或者有更好的方法来完成……我洗耳恭听 谢谢 XAMLC# WPF Gridview复选框列标题MVVM,c#,wpf,mvvm,C#,Wpf,Mvvm,我仍然在思考整个MVVM模式,但在尝试为Gridview创建一个复选框列之前,我认为我已经很好地掌握了它。我需要用户能够选择列出的所有项目(通过标题复选框)或选择单独列出的项目。我将复选框的IsChecked属性数据绑定到viewmodel上的两个布尔字段。单元格模板上的复选框按预期工作,并触发属性更改事件。标题不起任何作用。我错过了什么。这对我来说还是新鲜事,所以要温柔。还有,如果有什么事情我应该做,或者有更好的方法来完成……我洗耳恭听 谢谢 XAML <UserControl x:C
<UserControl x:Class="CheckBoxDemo.GridDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<ListView ItemsSource="{Binding PersonList}">
<ListView.View>
<GridView>
<GridViewColumn Width="50">
<GridViewColumn.HeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsMainSelected}"/>
</DataTemplate>
</GridViewColumn.HeaderTemplate>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="100"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
问题在于GridViewColumn不是可视化树的一部分。这意味着它不会继承父ListView的DataContext。必须找到引用ViewModel的其他方法。它允许您轻松引入“人工继承的”数据上下文
<UserControl.Resources>
<spy:DataContextSpy x:Key="Spy" />
</UserControl.Resources>
<DataTemplate>
<CheckBox IsChecked="{Binding Source={StaticResource Spy} Path=DataContext.IsMainSelected}"/>
</DataTemplate>
感谢您的链接-在过去几年中,我已经多次解决了相同的问题,但不知何故错过了这一点!谢谢这很有效。我使用了这三种方法中比较简单的一种,并将数据上下文添加到app.resources.com中。是否有关于选择所有行的正确方法的建议。我见过一些方法,但是它们看起来很粗糙,不像MVVM模式那么优雅。
public class Person:INotifyPropertyChanged
{
public string Name { get; set; }
// Fields...
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
if (_isSelected == value)
return;
_isSelected = value;
NotifyPropertyChanged("IsSelected");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
<UserControl.Resources>
<spy:DataContextSpy x:Key="Spy" />
</UserControl.Resources>
<DataTemplate>
<CheckBox IsChecked="{Binding Source={StaticResource Spy} Path=DataContext.IsMainSelected}"/>
</DataTemplate>