2015-03-08 2 views
0

У меня уже кто-то помогал с этим раньше, но теперь, когда я переписываю все в MVVM, я потерял способность сделать это ... Опять же!Как ссылаться на страницу (просмотр) для модели просмотра?

Pre-MVVM переписывают, у меня был эта строка коды в коде моей страницы:

var window = MahApps.Metro.Controls.TreeHelper.TryFindParent<MetroWindow>(this); 

прямо в конце концов, «это» означал страницу. Теперь этот код сидит в моей модели просмотра с красноватой красной линией, и я не знаю, что заменить. Я не думаю, что могу поставить:

SideBar sb = new SideBar(); 
var window = MahApps.Metro.Controls.TreeHelper.TryFindParent<MetroWindow>(sb); 

потому что это создаст новый экземпляр боковой панели ... не так ли? Эта страница загружается как источник по умолчанию для фрейма на главной странице btw, а не инициируется с помощью кода.

+0

Никогда не пытайтесь переписать код следующим образом 1: 1 ... Ваша модель просмотра не должна вызывать какой-либо метод, как это вообще! Переосмыслите свой подход, потому что MVVM не «берет мой код из кода и помещает его в отдельный класс». – walther

+0

Для этого я этого не делал ... Но я совершенно не знаком с тем, что происходит в этой строке ... и я хочу добиться такого же эффекта. Знаете ли вы, что я мог бы сделать вместо этого? – pingu2k4

+1

Ну, очевидно, он пытается найти родителя объекта, в данном случае родителя страницы, который будет Window ... Не уверен, как вы используете его в коде позже, но ваша ViewModel не должна знать ничего о Окне, ни о Стене. Вам нужно поставить эту логику в другом месте, если вам это даже понадобится ... – walther

ответ

0

Вы можете передать окно в качестве параметра какого-либо действия в вашу модель просмотра.

<Button Content="Test" 
    Command="{Binding ShowPopupCommand}" 
    CommandParameter="{Binding RelativeSource= 
     {RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" /> 

И на вашей команде зрения модели захватить параметр

ShowPopupCommand = new RelayCommand(o => 
{ 
    var wnd = o as Window; 
}); 

Код для RelayCommand

public class RelayCommand<T> : ICommand 
    where T : class 
{ 
    private Action<T> execute; 
    private Func<T, bool> canExecute; 

    public RelayCommand(Action<T> execute, Func<T, bool> canExecute = null) 
    { 
     this.execute = execute; 
     this.canExecute = canExecute; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    public bool CanExecute(object parameter) 
    { 
     return this.canExecute == null || this.canExecute(parameter as T); 
    } 

    public void Execute(object parameter) 
    { 
     this.execute(parameter as T); 
    } 
} 

public class RelayCommand : RelayCommand<object> 
{ 
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null) 
     : base(execute, canExecute) 
    { 
    } 
} 

Посмотреть модели:

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     ShowPopupCommand = new RelayCommand(o => 
     { 
      var wnd = o as Window; 
      var putBreakPointhere = 1; 
     }); 
    } 

    public ICommand ShowPopupCommand { get; set; } 
} 

wnd

+1

Как бы вы протестировали VM следующим образом? – walther

+0

Я не могу получить параметр, чтобы пройти ... Это то, что у меня есть ATM, где я должен поместить параметр? statsRefresh = new RelayCommand (param => this.StatsRefresh_Click(), null); Тогда, мой метод: public void StatsRefresh_Click (окно MetroWindow) – pingu2k4

+0

Спасибо за редактирование - я все еще запутался, извините! У меня уже есть команда relay, но она немного другая. Могу ли я вставить эту команду реле в нее и перегрузить ее? Затем ... запустив ShowPopupCommand = new RelayCommand (... Будет ли запускать отдельный метод? Моя текущая команда передает команду relay, которую я хочу запустить ... но я не вижу этого в вашей? Извините! :( – pingu2k4

0

Вы не добавили новый экземпляр Sidebar к визуальному дереву, поэтому, конечно, нет родителя MetroWindow, так как у него нет родителя вообще.

Предлагаю Вам ближе ознакомиться с шаблоном MVVM. Модель представления не должна иметь представления о реальном пользовательском интерфейсе. Я написал small MVVM library на основе MahApps.Metro и Autofac, возможно, это может быть отправной точкой для вас.

Смежные вопросы