【问题标题】:How to access with Field Initializer and access wpf Controls如何使用字段初始化器访问和访问 wpf 控件
【发布时间】:2013-01-05 12:57:22
【问题描述】:

我有,

    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() 方法,然后我想访问文本框和数据网格。我应该怎么做?

或者我应该如何拥有 RCommand 类..?

【问题讨论】:

  • 在 MVVM 中,ViewModel 不应该对 View 有任何了解。使用 ChrisF 建议的事件。请注意,您在构造函数中的 null 检查是错误的:if (predicate == null) 应该是 if (action == null)
  • @weston - 感谢您指出...
  • @weston - 你能给出一个示例代码来从视图模型中触发一个事件并在视图中处理它吗?
  • 这是一个很好的 MVVM visualstudiogallery.msdn.microsoft.com/… 包括事件“聚合”的教程。
  • @weston - 感谢您的链接...

标签: wpf static wpf-controls wpfdatagrid relaycommand


【解决方案1】:

只需将初始化移至类的构造函数即可:

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
}

【讨论】:

  • 感谢您的想法...但我仍然无法访问我的添加方法中的 wpf 控件..
  • @sarathprasath - 我需要更多关于这个类如何与你的观点相关的信息。
  • 你能给出一个示例代码,说明如何从视图模型中触发事件以在视图中处理它...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多