gpt4 book ai didi

c# - 单击按钮时禁用选中的复选框

转载 作者:行者123 更新时间:2023-11-30 17:02:53 25 4
gpt4 key购买 nike

刚开始使用 MVVM 设计模式,但我被卡住了。

当我的应用程序启动时,我有一个填充了对象名称列表的 treeview。我已经设置了 IsChecked 绑定(bind),它工作正常。我正在尝试设置 IsEnabled 绑定(bind)。

我希望用户在 TreeView 中选择他想要的项目,然后单击三个按钮之一来执行操作。单击时,我希望所选项目保留在 TreeView 中,但被禁用,因此用户无法对这些项目执行其他操作。

我在应用程序中使用 RelayCommand 类。

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));
}
}

在你的 setter 中你可以说:

public bool IsEnabled
{
set
{
_isEnabled = value;
SetPropertyChanged<ViewModel>(x => x.IsEnabled);
}
}

现在它是强类型的,这很好。

关于c# - 单击按钮时禁用选中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com