使属性激发切换复选框WPF DataGrid

使属性激发切换复选框WPF DataGrid,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,如何获得属性更改以注册复选框切换?我希望在切换复选框但无法触发属性更改时启用“保存”按钮,以便调用RaiseCanceTechChanged。我的复选框位于数据网格中。IsGeneric是程序的一个属性Selected我将该属性添加到我的视图模型中以查看这是否有帮助,但没有 XAML m.IsGenericView); } } 公共bool ShowAtTop{get;set;} } } 视图模型 public class ManageProgramsViewModel : ViewModel

如何获得属性更改以注册复选框切换?我希望在切换复选框但无法触发属性更改时启用“保存”按钮,以便调用RaiseCanceTechChanged。我的复选框位于数据网格中。IsGeneric是程序的一个属性Selected我将该属性添加到我的视图模型中以查看这是否有帮助,但没有

XAML

m.IsGenericView);
}
}
公共bool ShowAtTop{get;set;}
}
}
视图模型

public class ManageProgramsViewModel : ViewModelDetailBase<ManageProgramsViewModel, Program>
{
    public ICommand SaveProgramsCommand
    {
    get
    {
        return this.saveProgramsDelegate
            ?? (this.saveProgramsDelegate = Helpers.DelegateCommandFactory.CreateCommand(this.SavePrograms, this.CheckCanSavePrograms));
    }
    }
}

public ObservableCollection<Program> Programs
{
    get
    {
        return this.Programs;
    }

    private set
    {
        this.programs = value;

        this.NotifyPropertyChanged(m => m.Programs);
    }
}

public Program ProgramSelected
{
    get
    {
        return this.programSelected;
    }

    private set
    {
        this.programSelected = value;

        this.NotifyPropertyChanged(m => m.ProgramSelected);
    }
}

public bool IsGenericView       // Never hits the breakpoint when I check or uncheck my checkbox
{
    get
    {
        return this.isGenericView;
    }

    set
    {
        this.isGenericView = value;

        this.NotifyPropertyChanged(m => m.IsGenericView);

        this.CanSavePrograms = !this.CanSavePrograms;
    }
}

public bool CanSavePrograms
{
    get
    {
        return this.canSavePrograms;
    }

    set
    {
        this.canSavePrograms = value;

        Helpers.DelegateCommandFactory.RaiseCanExecuteChanged(this.SaveProgramsCommand);
    }
}
公共类管理程序viewmodel:ViewModelDetailBase { 公共ICommand保存程序命令 { 得到 { 返回此文件。saveProgramsDelegate ??(this.saveprogramsedelegate=Helpers.DelegateCommandFactory.CreateCommand(this.SavePrograms,this.CheckCanSavePrograms)); } } } 公共可观测收集计划 { 得到 { 归还这个。程序; } 专用设备 { 这个程序=值; this.NotifyPropertyChanged(m=>m.Programs); } } 已选定公共计划 { 得到 { 返回此选项。选择此选项; } 专用设备 { this.programSelected=值; this.NotifyPropertyChanged(m=>m.ProgramSelected); } } public bool IsGenericView//当我选中或取消选中我的复选框时,从不点击断点 { 得到 { 返回this.isGenericView; } 设置 { this.isGenericView=值; this.NotifyPropertyChanged(m=>m.IsGenericView); this.CanSavePrograms=!this.CanSavePrograms; } } 公共广播节目 { 得到 { 返回此.canSavePrograms; } 设置 { this.canSavePrograms=值; Helpers.DelegateCommandFactory.RaiseCanExecuteChanged(this.SaveProgramsCommand); } }
在XAML中,您应该使用
DataTrigger

...
<Button Command="{Binding SaveProgramsCommand}" Content="Save Programs" >
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Opacity" Value=".5" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ProgramSelected.IsGenericView}" Value="True">
                    <Setter Property="IsEnabled" Value="True" />
                    <Setter Property="Opacity" Value="1" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>   
...
此外,ViewModel还应实现接口
INotifyPropertyChanged

public class Program : INotifyPropertyChanged
{
    private bool _isGenericView;
    public string Name { get; set; }

    public string Value { get; set; }

    public bool IsGenericView
    {
        get { return _isGenericView; }
        set
        {
            _isGenericView = value;
            OnPropertyChanged("IsGenericView");
        }
    }

    public bool ShowAtTop { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}
...
public Program ProgramSelected
{
    get
    {
        return this.programSelected;
    }
    set
    {
        this.programSelected = value;
        OnPropertyChanged("ProgramSelected");
    }
}
...

在XAML中,您应该使用
DataTrigger

...
<Button Command="{Binding SaveProgramsCommand}" Content="Save Programs" >
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Opacity" Value=".5" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ProgramSelected.IsGenericView}" Value="True">
                    <Setter Property="IsEnabled" Value="True" />
                    <Setter Property="Opacity" Value="1" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>   
...
此外,ViewModel还应实现接口
INotifyPropertyChanged

public class Program : INotifyPropertyChanged
{
    private bool _isGenericView;
    public string Name { get; set; }

    public string Value { get; set; }

    public bool IsGenericView
    {
        get { return _isGenericView; }
        set
        {
            _isGenericView = value;
            OnPropertyChanged("IsGenericView");
        }
    }

    public bool ShowAtTop { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}
...
public Program ProgramSelected
{
    get
    {
        return this.programSelected;
    }
    set
    {
        this.programSelected = value;
        OnPropertyChanged("ProgramSelected");
    }
}
...

首先,ProgramSelected属性不应该是ViewModel的私有属性,它应该是视图写入其值的公共属性

在这种情况下,我要做的是处理当前选定元素的PropertyChange事件。请注意,首先您应该小心地取消订阅上一个选定项目的事件处理程序

public Program ProgramSelected
{
    get
    {
        return this.programSelected;
    }

    set
    {
        if (programSelected != value){

            if (programSelected != null)
                programSelected.PropertyChanged -= program_PropertyChanged;

                programSelected = value;

                if (programSelected != null)
                    programSelected.PropertyChanged += program_PropertyChanged;      

                NotifyPropertyChanged(m => m.ProgramSelected);
           } 
    }
}

private void program_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName.Equals("IsGenericView"))
        RaiseCanExecuteCommands();   
}

首先,ProgramSelected属性不应该是ViewModel的私有属性,它应该是视图写入其值的公共属性

在这种情况下,我要做的是处理当前选定元素的PropertyChange事件。请注意,首先您应该小心地取消订阅上一个选定项目的事件处理程序

public Program ProgramSelected
{
    get
    {
        return this.programSelected;
    }

    set
    {
        if (programSelected != value){

            if (programSelected != null)
                programSelected.PropertyChanged -= program_PropertyChanged;

                programSelected = value;

                if (programSelected != null)
                    programSelected.PropertyChanged += program_PropertyChanged;      

                NotifyPropertyChanged(m => m.ProgramSelected);
           } 
    }
}

private void program_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName.Equals("IsGenericView"))
        RaiseCanExecuteCommands();   
}

你能给我看一下
程序
课程吗?不知道你的意思。抱歉…我知道你的意思…现在添加。
程序必须实现
INotifyPropertyChanged
。DataGrid绑定到
程序
对象的集合,列绑定到
程序
IsGenericView
属性。ViewModel中的
IsGenericView
属性现在完全不相关,您需要将其连接到
ProgramSelected.IsGenericView
。您能给我看一下
Program
class?Program class吗?不知道你的意思。抱歉…我知道你的意思…现在添加。
程序必须实现
INotifyPropertyChanged
。DataGrid绑定到
程序
对象的集合,列绑定到
程序
IsGenericView
属性。ViewModel中的
IsGenericView
属性现在完全不相关,您需要将其连接到
ProgramSelected.IsGenericView
。我仍在处理此问题,正在考虑使用您的解决方案,但我需要在IsGenericView更改时启用该按钮,不仅仅是当为true时。我仍在处理此问题,并正在考虑使用您的解决方案,但我需要在IsGenericView更改时启用该按钮,而不仅仅是在为true时。