我之前已经有人帮助了这个,但是现在我将所有内容重写为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中帧的默认源加载,而不是通过代码启动。
答案 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; }
}
答案 1 :(得分:0)
您没有将新的Sidebar
实例添加到可视树中,因此当然没有MetroWindow
个父级,因为它根本没有父级。
我建议让自己更熟悉MVVM模式。视图模型应该没有实际UI的概念。我写了一篇基于MahApps.Metro和Autofac的small MVVM library,也许它可能是你的起点。