используя EventToCommand & PassEventArgsToCommand :: как получить отправителя или лучшую метафору? - PullRequest
1 голос
/ 07 января 2011

Смысл того, что я делаю, заключается в том, что в модели представления должно происходить много вещей, но когда представление загружено, а не в конструкторе. Я мог бы подключить обработчики событий и отправлять сообщения, но мне это кажется немного неаккуратным. Я реализую базовое представление и базовое представление, где содержится эта логика, поэтому, надеюсь, все мои представления получат ее по умолчанию.

Возможно, я даже не могу получить то, что хочу: отправитель. Я просто подумал, что это то, что RoutedEventArgs.OriginalSource должен был быть?

[Edit] Тем временем, я подключил EventHandler в xaml.cs, и, конечно же, там тоже есть NULL. Так что, думаю, мне действительно нужно знать, возможно ли получить ссылку на представление / отправителя в команде? [/ Edit]

Моя реализация требует, чтобы вспомогательный класс для моих viewmodels, отвечающий за создание «окон», знал об элементе управления «хост», к которому добавляются все окна. Я открыт для предложений для достижения этой цели за пределами использования eventtocommand. :)

(код для Unloaded такой же)

    #region ViewLoadedCommand
    private RelayCommand<RoutedEventArgs> _viewLoadedCommand = null;
    /// <summary>
    /// Command to handle the control's Loaded event. 
    /// </summary>
    public RelayCommand<RoutedEventArgs> ViewLoadedCommand
    {
        get
        {
            // lazy-instantiate the RelayCommand on first usage
            if (_viewLoadedCommand == null)
            {
                _viewLoadedCommand = new RelayCommand<RoutedEventArgs>(
                    e => this.OnViewLoadedCommand(e));
            }
            return _viewLoadedCommand;
        }
    }
    #endregion ViewLoadedCommand


    #region View EventHandlers
    protected virtual void OnViewLoadedCommand(RoutedEventArgs e)
    {
        EventHandler handler = ViewLoaded;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    #endregion

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Я пытаюсь решить эти проблемы с прямым xaml и командование, когда это возможно.Я использовал EventToCommand для самого представления (UserControl) следующим образом:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="Loaded">
    <mvvmlight:EventToCommand Command="{Binding LoadCommand}" />
  </i:EventTrigger>
</i:Interaction.Triggers>
2 голосов
/ 24 января 2011

Джо,

Моя позиция в MVVM:
Представление: знает о ViewModel
ViewModel: знает о модели (не имеет представления о представлении)
Модель: содержит данные.(НЕТ знания ViewModel, View)

Если бы я был в вашей ситуации, я бы использовал базовый ViewModel для реализации пользовательского интерфейса IViewModel.(На самом деле, у меня есть IViewModel интерфейс, который реализован моим public abstract class ViewModelBase, и все мои ViewModel наследуют ViewModelBase.)

public interface IViewModel
{  
   void Load();
   void UnLoad();
   // other Properties, Methods, etc.
}
public abstract class ViewModelBase : IViewModel
{
   public virtual/*or abstract*/ void Load()
   {
      // code
   }
}

тогда в вашем View:

this.Loaded += (o, e) => { if(ViewModel != null) { ViewModel.Load(); } }  

Наконец, чтобы различать конкретные виды и / или модели представления, я использую общедоступную строку Token (сгенерированную Guid).

...