如何引用viewmodel用于的页面(视图)?

时间:2015-03-08 01:19:08

标签: c# wpf mvvm mahapps.metro

我之前已经有人帮助了这个,但是现在我将所有内容重写为MVVM,我已经失去了这样做的能力......再次!

预MVVM重写,我在我的页面后面的代码中有这行代码:

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

最后,“this”表示页面。现在,这段代码位于我的viewmodel中,带有一条波浪形的红线,我不知道该用什么代替它。我认为我不能放:

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

因为这会创建侧边栏的新实例......不是吗?此页面作为主页btw中帧的默认源加载,而不是通过代码启动。

2 个答案:

答案 0 :(得分: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 :(得分:0)

您没有将新的Sidebar实例添加到可视树中,因此当然没有MetroWindow个父级,因为它根本没有父级。

我建议让自己更熟悉MVVM模式。视图模型应该没有实际UI的概念。我写了一篇基于MahApps.Metro和Autofac的small MVVM library,也许它可能是你的起点。