我有这个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中调用方法?
答案 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
类。
另见这些相关帖子:
Closed
事件似乎已经做了您想要的事情。