【问题标题】:Calling Usercontrol method from another form从另一个窗体调用 Usercontrol 方法
【发布时间】:2016-04-30 14:04:03
【问题描述】:

我在主窗口中加载了这个带有 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 引用到入口窗口来加载 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();
    }

既然我想在不同的Usercontrols中使用相同的输入表单,有没有更有效的方法来调用Usercontrol中的方法?

【问题讨论】:

    标签: c# wpf user-controls


    【解决方案1】:

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

    首先,你的newDataEntry 类完全依赖Usercontrol1 类是一个错误。这应该已经很明显了,由于您在尝试将它与其他 UserControl 类重用时遇到的问题,但它也是一个基本的 OOP 概念:一个存在以支持其他类的类本身不应依赖于该其他类。这样做会以与 OOP 的主要目标根本相反的方式破坏可重用性。

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

    当然,如果newDataEnty 窗口以模态方式使用(即您调用ShowDialog()),那么订阅Closed 事件就过分了。当ShowDialog() 方法返回时,您可以调用任何您需要的代码。

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

    另请参阅这些相关帖子:

    【讨论】:

    • 感谢您的健康回答。为了让事情更清楚,fillList() 方法连接到一个数据库,并用仅在 Usercontrol1 本身中显示/使用的数据填充 Listview。使用 .Show() 调用的 newDataEntry 表单; buttonentry 方法只是简单地将新条目添加到数据库中,“刷新” Usercontrol1 的 Listview 并关闭条目表单。由于我是一名有 2 周 C#/WPF 经验的学者,我并不真正了解更难的技术。如果您能告诉(根据给定的信息)调用 fillList() 的最通用方法是什么,我们将不胜感激。
    • 您添加的唯一信息是在您的评论中,您甚至没有澄清newDataEntry 窗口是否以模态方式显示。无论如何,我确实在上面提到了两种最可能正确的方法:如果是模态的,那么当ShowDialog() 返回时让调用者 调用fillList() 方法;如果不是模态的,则订阅Closed 事件并让事件处理程序调用fillList()。无论哪种方式,newDataEntry 都没有理由了解任何用户控件对象。
    猜你喜欢
    • 2019-09-05
    • 2021-07-26
    • 2011-08-10
    • 2015-05-17
    • 2022-01-23
    • 2012-09-10
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多