Хм, это будет сложно.Я хотел бы создать UserControl с сеткой, а затем поместить один UserControl в Window1, а другой в Window2.Но чтобы синхронизировать состояние Window1-Grid и Window2-Grid, вам придется привязать их к одному и тому же объекту.
Редактировать: Вот, подготовил для вас пример
Шаг 1: Поместите Grid
в UserControl
, чтобы его можно было повторно использовать.
Обратите внимание, что для свойства UpdateSourceTrigger
в привязке установлено PropertyChanged
это обновляет исходный объект, когда пользователь печатает, поэтому мы увидим изменения в Window2
, поскольку они происходят в Window1
.
CommonGrid.xaml
<UserControl x:Class="WindowSync.CommonGrid"
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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="5">
<TextBlock Text="Name: " />
<TextBox Width="200" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5">
<CheckBox IsChecked="{Binding IsAdmin, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text=" Is Admin" />
</StackPanel>
</Grid>
</UserControl>
Шаг 2: Поместите UserControl
в нужные окна.
Примечание: вы должны ссылаться на пространство имен, в котором находится UserControl
, в этом случае пространство именWindowSync
, эта строка позволяет нам использовать пространство имен xmlns:app="clr-namespace:WindowSync"
.
Window1.xaml
<Window x:Class="WindowSync.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:WindowSync"
Title="Window 1" Height="200" Width="400">
<app:CommonGrid x:Name="Window1Grid" />
</Window>
Windo1.xaml.cs
public Window1()
{
InitializeComponent();
Window1Grid.DataContext = Person.User; // bind the UserControl in Window1 to the an object
new Window2().Show(); // create an instance of window 2 and show it
}
Window2.xaml
<Window x:Class="WindowSync.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:WindowSync"
Title="Window 2" Height="200" Width="400">
<app:CommonGrid x:Name="Window2Grid" />
</Window>
Window2.xaml.cs
public Window2()
{
InitializeComponent();
Window2Grid.DataContext = Person.User; // bind the UserControl in Window2 to the same object
}
Person.cs
Я только что создал случайный объект с именем persдля демонстрации.
Примечание: вам нужно реализовать интерфейс INotifyPropertyChanged
на вашем объекте и вызывать соответствующее событие PropertyChanged
всякий раз, когда что-то изменяется, это то, что позволяет нам синхронизировать две сетки.Window1 что-то меняет, событие PropertyChanged
запускается, Window2
поднимает его и вносит изменения.
public class Person : INotifyPropertyChanged
{
public static Person User = new Person();
#region Name
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
OnPropertyChanged("Name");
}
}
#endregion
#region IsAdmin
private bool _IsAdmin;
public bool IsAdmin
{
get { return _IsAdmin; }
set
{
_IsAdmin = value;
OnPropertyChanged("IsAdmin");
}
}
#endregion
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
#endregion
}
В любом случае, я надеюсь, это поможет вам.Я загрузил заархивированную версию проекта, если вы застряли.http://www.mediafire.com/?yv84xbben6tjdy7
Удачи.