我有一个用户控件,有3个文本框和一个组合框。我在我的主页面中多次添加这些用户控件(比如说5)。我在主页面中有一个按钮,如果这些文本框值中的任何一个更改或组合框选择更改(5 * 3 = 15个文本框和5 * 1 = 5个组合框),则应启用/禁用。
我正在使用MVVM,所以我将所有这些控件绑定到属性。有人能帮助我知道我怎么能做到这一点?如何捕获事件以对文本框或组合框进行任何更改并基于启用/禁用我的按钮?
答案 0 :(得分:1)
有时会有点痛苦,但这是CanExecute
/ CanExecuteChanged
的一个很好的用例。
您的按钮的Command
属性应绑定到ICommand
对象。该类可能只是在其构造函数中使用ViewModel
的实例,以便它可以检查CanExecute
中的所有相应字段。
然后,您需要在该命令对象上添加RaiseCanExecuteChanged
函数,以便在设置相关变量时可以调用它。该函数只会引发CanExceuteChanged
事件,因此该按钮将重新调用CanExecute
并更新其IsEnabled属性。
或者,您可以在按钮上绑定IsEnabled
,并在相关字段发生更改时更新绑定的bool
。
答案 1 :(得分:0)
您可以在ViewModel
的{{1}}上创建活动。当按钮值发生变化时触发它。
所以,让我们说你有你的控制VM。
UserControl
现在在按钮所在的ViewModel上。创建对事件的订阅,并添加public class MyControlViewModel
{
public event EventHandler OnTextboxOrComboBoxChanged;
private string _myTextBoxValue;
public string MyTextBoxValue
{
get { return _myTextBoxValue; }
set
{
_myTextBoxValue = value;
OnPropertyChanged("MyTextBoxValue");
if(OnTextboxOrComboBoxChanged != null)
OnTextboxOrComboBoxChanged(); // trigger the event
}
}
// other codes here
}
属性以在按钮上绑定。
IsEnabled
现在这只是一个代码模型,通过创建自己的public class MainViewModel
{
public MainViewModel
{
MyControlViewModel = new MyControlViewModel();
MyControlViewModel.OnTextboxOrComboBoxChanged += (sender, e) =>
{
IsButtonEnabled = false;
// add other process here
};
}
public bool IsButtonEnabled { get; set; }
public MyControlViewModel MyControlViewModel { get; set; }
}