同步在 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 应用程序,建议使用第二种方法,因为它将确保应用程序中的每个组件都是分离的并且具有单一职责
我正在尝试在 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 应用程序,建议使用第二种方法,因为它将确保应用程序中的每个组件都是分离的并且具有单一职责