从另一个表单调用Usercontrol方法

时间:2016-04-30 14:04:04

标签: c# wpf user-controls

我有这个Usercontrol,在主窗口中加载了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>

从这个Usercontrol中,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中调用方法?

1 个答案:

答案 0 :(得分:0)

如果没有一个好的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类。

另见这些相关帖子: