2012-05-31 2 views
3

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

окна 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> 

ответ

0

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

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

Далее вы должны стрелять INotifyPropertyChanged в классе Texto ...

4

Вам нужно будет передать ссылку на первое окно или объект, в котором вы обновляете свойство текста, во второе окно, это свойство 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> 
+0

В дополнение, если вы новичок в свойствах зависимостей, это может показаться сложным, это будет работать так же хорошо, если вы реализуете INotifyPropertyChanged и поднимите событие при изменении свойства TestString. – Andy

0

Если оба Textboxes имеют общий DataContext будет "просто работать" без какого-либо кода, необходимого ...

1

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

<TextBox DataContext="prueba" 

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

Создать свой объект данных в вашей MainWindow

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

и удалить все остальные задания DataContext.

Смежные вопросы