我试图对同事所做的代码进行一些更改。
因此,我有一个ShellView,它使用在其ViewModel中定义的方法加载文档(并将其显示为其内容),以及子视图,一个StatusBarView,它保存在文档和其他一些信息中导航的路径。
public class ShellViewModel
{
public StatusBarViewModel StatusBar { get; }
public ShellViewModel(StatusBarViewModel statusBarViewModel, ...)
{
StatusBar = statusBarViewModel;
var keymap = new Keymap();
keymap.Map("F2", new SimpleCommand("open-file",
"Shows the open file dialog",
param => OpenFile());
}
private void OpenFile()
{
// Logic to open the file that uses other methods
// inside this VM to validate the file
}
}
目前你可以按一个键加载一包新文件,我想用状态栏中的一个按钮做同样的事情并调用该方法。
从子视图调用父视图中存在的方法的正确方法是什么?
答案 0 :(得分:0)
有很多方法。首先需要分析你的目的。 - 您可以在子视图中创建ActionEvent或EventHandler,单击按钮可以引发该事件。 - 另一种使用方式可以使用Mediator模式/观察者模式
实施例: 内部子ViewModel:
public event EventHandler openFileEvent;
状态栏上的内部点击按钮操作:
private void btnClick()
{
if(null != openFileEvent)
{
openFileEvent(this, new EventArgs{});
}
}
内部父ViewModel:
statusBarViewModel.openFileEvent += new EventHandler(EventHandlerName);
private void EventHandlerName(objehct sender, EventArgs...)
{
...
OpenFile();
...
}
答案 1 :(得分:0)
在子视图中定义事件处理程序
public EventHandler OpenFileHandler
点击状态栏视图的按钮,执行以下操作:
public Btn_Click(object sender, RoutedEventArgs e)
{
OpenFileHandler(this, e);
}
在父视图中,在创建状态栏视图时,定义委托
statusbar.OpenFileHandler+= delegate
{
ShellViewModel instance = this.DataContext as ShellViewModel;
instance.OpenFile();
}
状态栏是我给你的状态栏视图的名称,但它代表了它的实例