Вопрос по c#, xaml, wpf – Связывание данных между двумя текстовыми полями в разных окнах

3

Я создал программу, которая изменяет имя в TextBox при установке или снятии флажка. Я хочу скопировать это текстовое поле в другом окне. Я думал, что с Data Mining в xaml будет возможно, но имя появляется только в одном окне. Окно второго окна не получает данные. Я покажу вам код двух окон.  Вы можете мне помочь? Thankss

Окно 1.cs ---

namespace WpfApplication1
{

public partial class Window1 : Window
{
    Texto prueba = new Texto("Carlos");


    public static string s;
    public Window1()
    {
       InitializeComponent( );
      // Fill initial person fields
       this.textBox1.Text = prueba.Name;          

    }


    private void checkBox1_Checked(object sender, RoutedEventArgs e)
    {


        prueba.Name="Carlos";
        textBox1.DataContext = prueba;
        textBox1.Text = prueba.Name;
    }

    private void checkBox1_UnChecked(object sender, RoutedEventArgs e)
    {
        prueba.Name = "Luis";
        textBox1.DataContext = prueba;
        textBox1.Text = prueba.Name;
    }
}

 public class Texto
{
    string name;
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

     public Texto( ) {}
     public Texto(string name) 
     {
       this.name = name;
     }

}


}

window1 xaml -------

     <Grid>
    <CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="62,118,0,0" Name="checkBox1" VerticalAlignment="Top" Checked="checkBox1_Checked" Unchecked="checkBox1_UnChecked" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="44,140,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>

window2 cs -----

 namespace WpfApplication1
 {

   public partial class MainWindow : Window
  {
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Window1 nueva = new Window1();
        nueva.Show();
    }
 }


}

window2 xaml --------

<Grid>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="82,121,0,0" Name="button1"  VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox DataContext="prueba" Text="{Binding Path=Name}" Height="23" HorizontalAlignment="Left" Margin="57,84,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />
  </Grid>

Ваш Ответ

4   ответа
4

Вам нужно будет передать ссылку либо на первое окно, либо на объект, для которого вы обновляете свойство text, во второе окно, для этого подойдет свойство DataContext, после чего вы можете привязать к нему элементы управления вторых окон.

В этом демонстрационном приложении я создал MainWindow и второе окно (Window1), приложение запускается в главном окне следующим образом.

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public string TestString
    {
        get { return (string)GetValue(TestStringProperty); }
        set { SetValue(TestStringProperty, value); }
    }

    public static readonly DependencyProperty TestStringProperty =  DependencyProperty.Register("TestString", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));

    public MainWindow()
    {
        InitializeComponent();

        // setup the test string.
        TestString = "this is a test.";

        // Create the second window and pass this window as it's data context.
        Window1 newWindow = new Window1()
        {
            DataContext = this
        };
        newWindow.Show();
    }
}

MainWindow.xaml - Обратите внимание на строку DataContext в объявлении окна.

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        >
    <Grid>
        <TextBox Text="{Binding TestString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="91,84,185,189" />
    </Grid>
</Window>

Теперь для Window1 код позади - это просто пустой класс окна по умолчанию, поэтому я не буду публиковать его, но xaml есть.

Window1.xaml

<Window x:Class="WpfApplication5.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <TextBlock Text="{Binding TestString, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>
Кроме того, если вы новичок в свойствах зависимостей, это может выглядеть устрашающе, это будет работать так же хорошо, если вы реализуете INotifyPropertyChanged и вызовете событие при изменении свойства TestString.
0

Несколько вещей здесь не так, но я, вероятно, могу дать вам быстрое решение, чтобы решить вашу проблему. Прежде всего, ваш DataContext в окне 2 не работает должным образом, вы можете установить его исключительно в своем коде прямо перед показом окна 1 ...

private void button1_Click(object sender, RoutedEventArgs e)
{
    Window1 nueva = new Window1();
    this.DataContext = nueva.prueba;
    nueva.Show();
}

Затем вы должны запустить INotifyPropertyChanged в вашем классе Texto ...

public class Texto : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string name;
    public string Name
    {
        get { return this.name; }
        set 
        { 
            this.name = value; 
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

     public Texto( ) {}
     public Texto(string name) 
     {
        this.name = name;
     }

}
1

Не устанавливайте DataContext явно или только через другую привязку. Ваш

<TextBox DataContext="prueba"

ничего не помогает DataContext будет наследоваться до тех пор, пока он не будет перезаписан. Не устанавливайте это явно. Следует установить один раз в обоих окнах.

Создайте свой объект данных в главном окне

Texto prueba = new Texto("Carlos");
Window1 nueva = new Window1();
nueva.DataContext = prueba;
nueva.Show();

и удалите все другие назначения DataContext.

0

Если оба текстовых поля имеют общий текстовый текст, он будет «просто работать». без кода требуется ...

Похожие вопросы