同步在 2 个不同 windows 中使用的相同用户控件

Sync same User Control being used in 2 different windows

我正在尝试在 2 个不同的 Windows 中使用相同的用户控件。目标是如果用户控件中的某个控件发生更改,它将反映在使用相同用户控件的另一个 window 中。我的理解是它们不是 "syncing",因为每个 window 都有自己的用户控件实例。我怎样才能使两者使用相同的实例或彼此同步?

为了更好地解释我需要帮助的内容,我创建了一个简单的项目并创建了 2 xaml windows -- 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>

理想情况下,两个 windows 应该有一个单独的用户控件实例,这也反映在您的示例中。但是,如果您需要将 main window 的复选框状态与 second window 的复选框状态同步,您可以使用以下任一方法来实现。

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

2.) 使用 EventAggregator 模式,其中您的主要 window 将订阅来自第二个 Window 的复选框状态更改事件。 Second window 将在其复选框状态更改后立即发布状态更改事件。

对于 WPF 应用程序,建议使用第二种方法,因为它将确保应用程序中的每个组件都是分离的并且具有单一职责