【问题标题】:Sync same User Control being used in 2 different windows同步在 2 个不同窗口中使用的相同用户控件
【发布时间】:2020-08-16 08:06:00
【问题描述】:

我正在尝试在 2 个不同的 Windows 中使用相同的用户控件。目标是如果用户控件中的某个控件发生更改,它将反映在使用相同用户控件的另一个窗口中。我的理解是它们不是“同步”的,因为每个窗口都有自己的用户控件实例。如何让两者使用相同的实例或相互同步?

为了更好地解释我需要帮助的内容,我创建了一个简单的项目并创建了 2 个 xaml 窗口——MainWindow 和 SecondWindow。我还创建了一个名为 CommonUC 的用户控件。

在 MainWindow 中,我还添加了一个按钮,单击该按钮可打开 SecondWindow。如果在 SecondWindow 中更改,是否有办法反映 MainWindow 中复选框的更改?

MainWindow.xaml:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    xmlns:uc="clr-namespace:Test.UserControls"
    mc:Ignorable="d"
    Title="MainWindow" Height="200" Width="200">
<Grid>
    <uc:CommonUC/>
    <Button Content="Button" HorizontalAlignment="Left" Margin="54,116,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>

MainWindow.xaml.cs:

namespace Test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            SecondWindow secondWindow = new SecondWindow();
            secondWindow.Owner = System.Windows.Application.Current.MainWindow;
            secondWindow.ShowDialog();
        }
    }
}

SecondWindow.xaml:

<Window x:Class="Test.SecondWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    xmlns:uc="clr-namespace:Test.UserControls"
    mc:Ignorable="d"
    Title="SecondWindow" Height="200" Width="200">
<Grid>
    <uc:CommonUC/>
</Grid>

CommonUC.xaml:

<UserControl x:Class="Test.UserControls.CommonUC"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Test.UserControls"
         mc:Ignorable="d" 
         d:DesignHeight="50" d:DesignWidth="100">
<Grid>
    <CheckBox Content="CheckMe"/>
</Grid>

【问题讨论】:

  • 在 Internet 上搜索 MVVM 和 WPF 数据绑定。然后将两个(或更多)UserControl 实例的属性绑定到视图模型类的单个实例的属性。
  • 尝试使用 MainWindow 的 CommonUc 实例在 Button_Click 方法上设置 SecondWindow 内的 CommonUC 元素。它应该可以工作。

标签: c# wpf xaml user-controls


【解决方案1】:

理想情况下,两个窗口应该有一个单独的用户控件实例,这也反映在您的示例中。但是,如果您需要将主窗口的复选框状态与第二个窗口的复选框状态同步,您可以使用以下方法之一。

1.) 遵循 MVVM 模式,这是 WPF 应用程序推荐的模式,然后将两个视图(MainWindow 和 SecondWindow)绑定到相同的模型。但是,我不会在以后建议这种方法,如果您需要在任何视图中添加额外的逻辑,它将使您的模型无法维护,并且模型也会破坏单一职责的设计原则。

2.) 使用 EventAggregator 模式,您的主窗口将从第二个窗口订阅复选框状态更改事件。第二个窗口将在其复选框状态更改后立即发布状态更改事件。

第二种方法推荐用于 WPF 应用程序,因为它可以确保应用程序中的每个组件都是解耦的并且具有单一职责

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多