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);
}
}
}