Member 13810592 Ответов: 1

Как связать два usercontrol в mainwindow (WPF/C#)


Оке, у меня есть один UserControl с одним текстовым полем и одним бутоном , у меня есть второй usercontrol с Датагридом и кнопкой внизу.Я хочу acompish, что когда я нажимаю на кнопку в первый элемент управления UserControl я добавить значение из текстового поля в DataGrid в секунду UserControl и когда я нажимаю на элемент управления DataGrid строки второго пользовательского элемента управления, а затем нажмите на кнопку в второй элемент управления UserControl я добавить значение из элемента управления DataGrid строку в TextBox в первый элемент управления UserControl.. Моя проблема в том, что я не знаю, как привязать его к правильной работе . Пожалуйста, помогите, любая помощь хороша ..

Что я уже пробовал:

Я не знаю, что делать, потому что я новичок в wpf и этом способе создания приложений Windows

1 Ответов

Рейтинг:
1

Wendelius

Один из способов сделать это заключается в том, что вы публикуете событие в пользовательском элементе управления и проводите это событие на уровне окна, чтобы получать события из элемента управления. Когда событие получено, вызовите метод на другом элементе управления, чтобы установить значение.

Рассмотрим следующий пример:
Класс для хранения аргументов события

public class SomeChangeEventArgs : System.EventArgs {
   public string TextValue { get; set; }
}

Пользовательский элемент управления XAML
<UserControl x:Class="MyNamespace.UserControl1"

             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:MyNamespace"

             mc:Ignorable="d" 

             d:DesignHeight="300" 

             d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" x:Name="MyTextBox"/>
        <Button Grid.Row="1" x:Name="TheButton" Content="Press me..." Click="TheButton_Click"/>
    </Grid>
</UserControl>

Пользовательский контроль cs
using System;
using System.Windows;
using System.Windows.Controls;

namespace MyNamespace {
   /// <summary>
   /// Interaction logic for UserControl1.xaml
   /// </summary>
   public partial class UserControl1 : UserControl {

      public event EventHandler<SomeChangeEventArgs> SomethingHasChanged;

      public UserControl1() {
         InitializeComponent();
      }

      private void TheButton_Click(object sender, RoutedEventArgs e) {
         this.SomethingHasChanged?.Invoke(
            this, new SomeChangeEventArgs() { 
               TextValue = this.MyTextBox.Text 
            }
         );
      }

      public void SetTextValue(string newText) {
         this.MyTextBox.Text = newText;
      }
   }
}

Главное окно XAML
<Window x:Class="MyNamespace.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:MyNamespace"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <local:UserControl1 Grid.Column="0" x:Name="FirstControl" SomethingHasChanged="First_SomethingHasChanged"/>
        <local:UserControl1 Grid.Column="1" x:Name="SecondControl" SomethingHasChanged="Second_SomethingHasChanged"/>
    </Grid>
</Window>

И в главном окне в CS
using System.Windows;

namespace MyNamespace {
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window {
      public MainWindow() {
         InitializeComponent();

      }

      private void First_SomethingHasChanged(object sender, SomeChangeEventArgs e) {
         this.SecondControl.SetTextValue(e.TextValue);
      }

      private void Second_SomethingHasChanged(object sender, SomeChangeEventArgs e) {
         this.FirstControl.SetTextValue(e.TextValue);
      }
   }
}