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