从另一个窗体调用 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
事件似乎已经完成了您想要的操作。
我在 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
事件似乎已经完成了您想要的操作。