从另一个窗体调用 Usercontrol 方法

Calling Usercontrol method from another form

我在 Mainwindow:

中加载了一个带有 Listview 的用户控件
 <Controls:MetroAnimatedSingleRowTabControl  Grid.Row="1" x:Name="MainTabControl" Controls:TabControlHelper.IsUnderlined="True" Margin="10,0,0,1">
            <TabItem Controls:ControlsHelper.HeaderFontSize="40" Header=" List"  Foreground="#CCB5BABB" Controls:ControlsHelper.HeaderFontStretch="UltraExpanded" HorizontalAlignment="Left" VerticalAlignment="Top" >
                <load:Usercontrol1 DataContext="{Binding}"  />
            </TabItem>

ButtonClick 从此用户控件调用另一个表单来输入新数据。将数据保存到数据库后,我通过将整个 Usercontrol 引用到条目 window :

来调用在 Usercontrol 中加载列表的方法
 private readonly Usercontrol1 temp;
    public newDataEntry(Usercontrol1 temp2)
    {
        InitializeComponent();
        temp= temp2;
    } 
     private void buttonentry(object sender, RoutedEventArgs e)
    {
        temp.fillList(); // list in Usercontrol fill
        this.Close();
    }

既然我想在不同的Usercontrol中使用同一个entry form,请问有没有更有效的方式来调用Usercontrol中的方法?

如果没有一个很好的 Minimal, Complete, and Verifiable example 清楚地表明你在做什么,为什么要调用这个方法,这个方法做了什么,以及你在概括这个动作时遇到了什么具体问题,就不可能知道确定您的方案的最佳答案是什么。也就是说,可以提供一些讨论。

首先,您的 newDataEntry class 完全依赖于 Usercontrol1 class 是错误的。这应该已经很明显了,由于您 运行 试图将它与其他 UserControl class 一起重用,但这也是一个基本的 OOP 概念:class 存在 支持 其他 class 本身不应依赖于其他 class。这样做会破坏可重用性,从根本上与 OOP 的主要目标背道而驰。

那么如何摆脱这种依赖呢?那么,C# 中最通用的方法是让您的 Usercontrol1 订阅 newDataEntry 对象的 Closed 事件。然后它可以在那个时候做任何它想做的事情,包括调用它自己的 fillList() 事件。

当然,如果 newDataEnty window 是模态使用的(即你调用 ShowDialog()),那么订阅 Closed 事件就太过分了。当 ShowDialog() 方法 returns.

时,你可以调用任何你需要的代码

综上所述,名称 fillList() 暗示您正在将列表数据直接复制到某些基于列表的控件中(例如您提到的 ListView)。事实上,在 WPF 程序中,您应该只操作视图模型并让 UI 做出相应的响应。同样,如果没有良好的 MCVE 显示上下文,就不可能确定您正在做什么,更不用说按照这些思路提供任何具体建议。可以说,这段代码很可能根本不属于 Usercontrol1 class。

另请参阅这些相关帖子:

  • How to call method of the main WPF window from the modal window?
    - 这似乎最适用。不幸的是,被接受和投票最多的答案是最糟糕的答案之一(恰好介绍了您在此处试图避免的那种 class 耦合),但是还有其他答案提供了一些有用的信息。
  • WPF MVVM call ViewModel Save method on Window Close
    - 这讨论了在使用适当的视图模型的上下文中做类似的事情。可能会也可能不会直接适用于您的场景。
  • Communicate between two windows forms in C# - 这是关于 Winforms 的,但在这个特定场景中,基本技术是相似的。在这种特殊情况下,您不需要声明新事件,因为 Closed 事件似乎已经完成了您想要的操作。