سؤال

أنا أطبق نمط MVVM لكل جوش سميث ويواجه صعوبة. لقد كنت أبحث في المشكلة هنا ولا يمكن أن يبدو أن تحصل على بناء الجملة صحيح تماما.

يبدو لي رمز أدناه لي كما يتبع بناء الجملة المطلوب، ولكن خطأ في تقارير Visual Studio "المندوب" النظام "لا تأخذ حجج" 2 " على الخط المشار إليه.

هل يمكن لأي شخص أن يرى أين أخطأ؟ شكرا!
+ توم

    RelayCommand _relayCommand_MoveUp;
    public ICommand RelayCommand_MoveUp
    {
      get
      {
        if (_relayCommand_MoveUp == null)
        {
          _relayCommand_MoveUp = new RelayCommand(
          (sender, e) => this.Execute_MoveUp(sender, e),     **ERROR REPORTED HERE**
          (sender, e) => this.CanExecute_MoveUp(sender, e));
          return _relayCommand_MoveUp;
        }
      }
    }

    private void Execute_MoveUp(object sender, ExecutedRoutedEventArgs e)
    {
      if (_selectedFolder != null)
      {
        _selectedFolder.SelectParent();
      }
    }

    private void CanExecute_MoveUp(object sender, CanExecuteRoutedEventArgs e)
    {
      e.CanExecute = (_selectedFolder != null) && (_selectedFolder.Parent != null);
        }


//And from Josh Smith:

  public class RelayCommand : ICommand
  {
    public RelayCommand(Action<object> execute);
    public RelayCommand(Action<object> execute, Predicate<object> canExecute);

    public event EventHandler CanExecuteChanged;

    [DebuggerStepThrough]
    public bool CanExecute(object parameter);
    public void Execute(object parameter);
  }
هل كانت مفيدة؟

المحلول

RelayCommand ليست مشكلة RouteDedEdedCommand، والتي أعتقد أنها هي المكان الذي تنتهي فيه الخلط.

منشئون أمر الترحيل يأخذ مندوب العمل واختياري مندوب المسند. وبعد لا تأخذ هؤلاء المندوبون حافلات EventArgs، فقط معلمة كائن واحد، وهذا هو السبب في مواجهتك خطأ. يتطلب المسند أيضا نوع المرسل من BOOL، وهو الخطأ التالي الذي ستحصل عليه. في المسند Canexecute بدلا من الإعداد E.CanExecute كما تفعل مع RoutEdCommand، يمكنك ببساطة إرجاع True / False.

إليك كيف ينبغي أن ننظر:

public ICommand RelayCommand_MoveUp
{
  get
  {
    if (_relayCommand_MoveUp == null)
    {
      _relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);

    }
    return _relayCommand_MoveUp;
  }
}

private void Execute_MoveUp(object sender)
{
  if (_selectedFolder != null)
  {
    _selectedFolder.SelectParent();
  }
}

private void CanExecute_MoveUp(object sender)
{
  return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}



تحرير (تمت إضافته من مناقشة في التعليقات):

إذا كنت ترغب في استخدام شيء أكثر مثل RouteDCommands، مما سيجعل المشاهدين أكثر اعتمادا على وجهات النظر المحددة WPF، فهناك بعض الخيارات الجيدة المتاحة.

هذه نقاش حصلت على فكرة كاملة عن استخدام RouteedCommands جنبا إلى جنب مع بدء MVVM.

و هنا حل صلب للغاية للقضايا التي قدمها جوش سميث وبيل كيمب.

نصائح أخرى

في نهاية هذا الأسبوع (22 أغسطس) فحص جوش سميث في تغييرات جديدة في Codeplex لمشروع MVVMfoundation الخاص به الذي يغير الطريقة التي تعمل بها RelayCommand للمندوبين مع معلمة. حذار!

لتمرير معلمة للمندوب، ستحتاج إلى استخدام RelayCommand الجديدu003CT> منشئ بدلا من ذلك:

    public ICommand GotoRegionCommand
    {
        get
        {
            if (_gotoRegionCommand == null)
                _gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter);
            return _gotoRegionCommand;
        }
    }
    private void GotoRegionCommandWithParameter(object param)
    {
        var str = param as string;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top