这里我有,
private ICommand AddCommand = new RCommand(p => true, p => Add() );
private void Add()
{
emp = new Employee();
DetailsEntryGrid.DataContext = emp;
EnableControls();
tBoxID.Focus();
tBoxID.SelectAll();
//throw new NotImplementedException();
}
vs2010抛出编译时错误'p'不能指向非静态字段,我无法访问网格和文本框..这些控件是wpf .. 我也无法为员工创建对象..
和Rcommand类是..
public class RCommand : ICommand
{
readonly Predicate<object> _CanExecute;
readonly Action<object> _Execute;
public RCommand(Action<object> exe) : this(null,exe)
{
}
public RCommand(Predicate<object> predicate, Action<object> action)
{
if (predicate == null)
throw new ArgumentNullException("execute must be provided");
_Execute = action;
_CanExecute = predicate;
}
public bool CanExecute(object parameter)
{
return _CanExecute == null ? true : _CanExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_Execute(parameter);
}
}
我想访问Add()方法,我想访问文本框和datagrids ..我该怎么办?
或者我应该如何拥有RCommand Class ..?
答案 0 :(得分:2)
只需将初始化移动到类的构造函数中:
public MyClass()
{
// other initialisation stuff
AddCommand = new RCommand(p => true, p => Add() );
}
从您的评论中 - 如果这是MVVM,那么您不应该在视图模型中访问视图中的元素。这增加了类之间的耦合,是一件“坏事”。
如果您需要更改视图上的值,那么您应该使用绑定。
如果您想要更改焦点并选择文本框中的所有文本,那么您应该从视图模型中触发事件并在视图中处理它,如果您可以访问文本框。
在视图模型中定义一个事件:
public event EventHandler<MyEventArgs> MyEvent;
然后,当您想要做出任何反应时,您就会触发该事件:
if (this.MyEvent != null)
{
this.MyEvent(this, new MyEventArgs(...));
}
其中...
被您需要传递的值(如果有)替换。
在您的视图构造函数中,您订阅了此事件:
this.viewModel.MyEvent += MyEventHandler;
视图可以引用视图模型,但不能反过来。
处理程序是:
private void MyEventHandler(object sender, MyEventArgs e)
{
// Do your stuff
}