单击按钮时禁用选中的复选框
本文关键字:复选框 按钮 单击 | 更新日期: 2023-09-27 18:34:11
刚开始使用MVVM设计模式,我卡住了。
当我的应用程序启动时,我有一个填充了对象名称列表的treeview
。我已经设置了IsChecked
绑定,它工作正常。我正在尝试设置IsEnabled
绑定。
我希望用户在树视图中选择他想要的项目,然后单击三个按钮之一来执行操作。单击时,我希望所选项目保留在树视图中,但被禁用,以便用户无法对这些项目执行其他操作。
我在应用程序中使用中继命令类。
private ICommandOnExecute _execute;
private ICommandOnCanExecute _canExecute;
public RelayCommand(ICommandOnExecute onExecuteMethod,
ICommandOnCanExecute onCanExecuteMethod)
{
_execute = onExecuteMethod;
_canExecute = onCanExecuteMethod;
}
#region ICommand Members
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return _canExecute.Invoke(parameter);
}
public void Execute(object parameter)
{
_execute.Invoke(parameter);
}
#endregion
我的对象模型类使用此
private bool _isEnabled;
public bool IsEnabled
{
get { return true; }
set { _isEnabled = value};
}
然后在我的按钮方法中,我有
if (interfaceModel.IsChecked)
{
//Does Something
MyObjectName.IsEnabled = false;
}
这是我的 xaml
<CheckBox IsChecked="{Binding IsChecked}" IsEnabled="{Binding IsEnabled, Mode=TwoWay}">
<TextBlock Text="{Binding MyObjectName}" Margin="5,2,1,2" HorizontalAlignment="Left" />
</CheckBox>
你需要这样的设置:
// Your ViewModel should implement INotifyPropertyChanged
class ViewModel : INotifyPropertyChnaged
{
private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
SetPropertyChanged("IsEnabled"); // Add this to your setter.
}
}
// This comes from INotifyPropertyChanged - the UI will listen to this event.
public event PropertyChangedEventHandler PropertyChanged;
private void SetPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged( this, new PropertyChangedEventArgs(property) );
}
}
}
请注意,PropertyChanged
来自让您的 ViewModel 实现INotifyPropertyChanged
。若要通知 UI,必须引发该事件,并告诉它更改了哪些属性(通常在 setter 中 - 见上文)。
或者,如果你不喜欢原始字符串(我个人不喜欢),你可以使用泛型和表达式树来做这样的事情:
public void SetPropertyChanged<T>(Expression<Func<T, Object>> onProperty)
{
if (PropertyChanged != null && onProperty.Body is MemberExpression)
{
String propertyNameAsString = ((MemberExpression)onProperty.Body).Member.Name;
PropertyChanged(this, new PropertyChangedEventArgs(propertyNameAsString));
}
}
在你的二传手中,你可以说:
public bool IsEnabled
{
set
{
_isEnabled = value;
SetPropertyChanged<ViewModel>(x => x.IsEnabled);
}
}
现在它是强类型,这有点不错。