您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何从其他视图模型调用主视图模型中的函数?

如何从其他视图模型调用主视图模型中的函数?

delegate方法链接的答案中使用的方法可以在任何父子关系中使用,也可以在任何方向上使用。这包括从子视图模型到父视图模型,子Window代码背后的代码Window,甚至是不涉及任何UI的纯数据关系。您可以delegate从MSDN上的“委托(C#编程指南)”页面中找到有关使用对象的更多信息。

我刚刚在今天早些时候回答了类似的问题。如果您查看viewmodels之间Passing参数,您将看到答案涉及到使用delegate对象。您可以简单地将这些delegates(从答案中)替换为您的方法,并且将以相同的方式工作。

请让我知道,如果你有任何问题。

更新>>>

是的,很抱歉,我完全忘记了您想要调用方法,但是…今晚我一直在撰写过多的文章。因此,仍然使用另一篇文章中的示例,只需在Parameterviewmodel_OnParameterChange处理程序中调用您的方法即可:

public void Parameterviewmodel_OnParameterChange(string parameter)
{
    // Call your method here
}
@H_404_30@

可以将其delegate视为返回父视图模型的路径……这就像引发一个名为的事件ReadyForYouToCallMethodNow.。实际上,您甚至不需要输入参数。您可以这样定义delegate

public delegate void ReadyForUpdate();

public ReadyForUpdate OnReadyForUpdate { get; set; }
@H_404_30@

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public delegate void ReadyForUpdate();

public ReadyForUpdate OnReadyForUpdate { get; set; }
@H_404_30@

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

可以将其delegate视为返回父视图模型的路径……这就像引发一个名为的事件ReadyForYouToCallMethodNow.。实际上,您甚至不需要输入参数。您可以这样定义delegate

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。

更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

可以将其delegate视为返回父视图模型的路径……这就像引发一个名为的事件ReadyForYouToCallMethodNow.。实际上,您甚至不需要输入参数。您可以这样定义delegate

public delegate void ReadyForUpdate();

public ReadyForUpdate OnReadyForUpdate { get; set; }
@H_404_30@

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。

更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

然后在父视图模型中(在像另一个示例一样附加处理程序之后):

public void Childviewmodel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
@H_404_30@

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。

更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。

更新2 >>>

再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
@H_404_30@

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

解决方法

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
public class TreeViewViewModel
{
     //Do I need to declare the MainWindowVM?

     public TreeViewViewModel() { ... }

     private void function()
     {
          //Command that affects display

          //Manually call function in MainWindowVM to refresh View
     }
}
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。

我猜我会做这样的事情…

TreeViewViewModel

我尝试使用以下方法MainWindowVM从访问TreeViewViewModel

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

其他 2022/1/1 18:15:39 有533人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶