Syn c один и тот же пользовательский элемент управления используется в 2 разных windows - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь использовать один и тот же пользовательский элемент управления в 2 разных Windows. Цель состоит в том, что если элемент управления в пользовательском элементе управления изменяется, он будет отражен в другом окне, которое использует тот же пользовательский элемент управления. Насколько я понимаю, они не "синхронизируются", потому что у каждого окна есть свой экземпляр пользовательского элемента управления. Как я могу сделать так, чтобы оба использовали один и тот же экземпляр или syn c между собой?

Чтобы лучше объяснить, с чем мне нужна помощь, я создал простой проект и создал 2 xaml windows - MainWindow и SecondWindow. Я также создал пользовательский элемент управления с именем CommonU C.

. В MainWindow я также добавил кнопку, которая открывает SecondWindow при нажатии. Есть ли способ отразить изменение флажка в MainWindow, если он был изменен в SecondWindow?

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>

CommonU C .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>

1 Ответ

1 голос
/ 02 мая 2020

В идеале два windows должны иметь отдельный экземпляр пользовательского контроля, и это отражено и в вашем примере. Однако если вам нужно синхронизировать c состояние флажка главного окна с состоянием флажка второго окна, вы можете сделать это любым из следующих подходов.

1.) Следуйте шаблону MVVM, который является рекомендуемым шаблоном для приложений WPF, а затем свяжите оба вида (MainWindow и SecondWindow) с одной моделью. Однако я не буду предлагать этот подход, так как в будущем, если вам понадобится добавить дополнительную логику c в любом представлении, это сделает вашу модель неуправляемой, и модель также нарушит принцип проектирования с одной ответственностью.

2.) Используйте шаблон EventAggregator, в котором ваше главное окно будет подписано на событие изменения состояния флажка из Второго окна. И второе окно опубликует sh событие изменения состояния, как только его состояние флажка изменится.

Второй подход рекомендуется для приложения WPF, поскольку он гарантирует, что каждый компонент в вашем приложении отделен и несет единоличную ответственность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...