Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Gridview复选框列标题MVVM_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF Gridview复选框列标题MVVM

C# WPF Gridview复选框列标题MVVM,c#,wpf,mvvm,C#,Wpf,Mvvm,我仍然在思考整个MVVM模式,但在尝试为Gridview创建一个复选框列之前,我认为我已经很好地掌握了它。我需要用户能够选择列出的所有项目(通过标题复选框)或选择单独列出的项目。我将复选框的IsChecked属性数据绑定到viewmodel上的两个布尔字段。单元格模板上的复选框按预期工作,并触发属性更改事件。标题不起任何作用。我错过了什么。这对我来说还是新鲜事,所以要温柔。还有,如果有什么事情我应该做,或者有更好的方法来完成……我洗耳恭听 谢谢 XAML <UserControl x:C

我仍然在思考整个MVVM模式,但在尝试为Gridview创建一个复选框列之前,我认为我已经很好地掌握了它。我需要用户能够选择列出的所有项目(通过标题复选框)或选择单独列出的项目。我将复选框的IsChecked属性数据绑定到viewmodel上的两个布尔字段。单元格模板上的复选框按预期工作,并触发属性更改事件。标题不起任何作用。我错过了什么。这对我来说还是新鲜事,所以要温柔。还有,如果有什么事情我应该做,或者有更好的方法来完成……我洗耳恭听

谢谢

XAML

 <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>