paleGegg0 Ответов: 2

WPF передача данных между окнами


Всем привет

Привет, у меня проблема с привязкой данных. Я могу связать данные между элементами управления внутри одного окна, но использование одних и тех же данных между несколькими окнами тривиально.

Вот очень простая программа, надеюсь, вы поняли идею

Window1. xaml (может быть приложением MainWindow)

<window x:class="WPF_Template.Window1" xmlns:x="#unknown">
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1. Able to be synchronized with window2" Height="145" Width="359">
    <grid>
        <stackpanel>
            <slider name="slider">
                Margin="4" Interval="1"
                TickFrequency="1"
                IsSnapToTickEnabled="True"
                Minimum="0" Maximum="100"/>
            <stackpanel orientation="Horizontal">
                <textblock width="Auto" horizontalalignment="Left">
                       VerticalAlignment="Center" Margin="4" 
                       Text="Gets and sets the value of the slider:" />
                <textbox width="40" horizontalalignment="Center" margin="4">
                 Text="{Binding 
                        ElementName=slider, 
                        Path=Value, 
                        Mode=TwoWay, 
                        UpdateSourceTrigger=PropertyChanged}" />
            </textbox></textblock></stackpanel>
            <Button Content="Show Window2" Click="Button_Click"></Button>
        </slider></stackpanel>
    </grid>
</window>


и файл window1.язык XAML.в CS

using System.Windows;

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

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window2 window2 = new Window2();
            window2.Show();
        }
    }
}


Теперь у нас есть window1 и мы хотим создать window2

<window x:class="WPF_Template.Window2" xmlns:x="#unknown">
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2. Always synchronized with window1" Height="126" Width="355">
    <grid>
        <stackpanel>
            <slider name="slider" margin="4" interval="1" tickfrequency="1">
                IsSnapToTickEnabled="True"
                Minimum="0" Maximum="100"/>
            <stackpanel orientation="Horizontal">
                <textblock width="Auto" horizontalalignment="Left">
                       VerticalAlignment="Center" Margin="4" 
                       Text="Gets and sets the value of the slider:" />
                <textbox width="40" horizontalalignment="Center" margin="4">
                 Text="{Binding ElementName=slider,Path=Value,Mode=TwoWay, 
                        UpdateSourceTrigger=PropertyChanged}" />
            </textbox></textblock></stackpanel>
            <Button Content="Close" Click="Button_Click"></Button>
        </slider></stackpanel>
    </grid>
</window>


и Window2.язык XAML.в CS

using System.Windows;

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

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}


Итак, то, что я хочу сделать, это то, что Window1 и window2 синхронизированный между собой. Если вы скомпилируете мой код, то увидите, что данные привязаны внутри windows индивидуально и нет никакого взаимодействия между окнами.

Пожалуйста, дайте мне совет!

Лучшие рекарды

Черт, не могу опубликовать свой полный xaml-код. Надеюсь, у вас все равно есть идея :doh:

2 Ответов

Рейтинг:
2

Vahid Hajizadeh

еще один способ передачи данных WPF между открытыми окнами.

в MainWindow.язык XAML.в CS:

((Window1)Application.Current.Windows[1]).textBlock1.Text="your text";
((Window1)Application.Current.Windows[1]).myProperty1=12;

или
foreach (Window item in Application.Current.Windows)
{
   if (item.Name == "Window1")
   {
      (Window1)item).textBlock1.Text="your text";
      (Window1)item).myProperty1=12;
   }
}


Цитата:
элемент управления textblock1 и myProperty1 в Window1. xaml


Рейтинг:
19

Nish Nishant

Пусть Window1 и Window2 используют один и тот же DataContext. Таким образом, данные разделяются, и если одно окно что-то обновляет, оно мгновенно отражается в другом.

В основном это будет один View-Model, два Viewс.


Henry Minute

Ваш ответ был помечен как ответ, но не имел 5???

Поэтому я дал тебе один. :)

paleGegg0

Извините за позднее обновление, просто проверил, и это сработало. Ты спас мне жизнь. Спасибо :)