2017-05-25 3 views
-1

インターネット上に次のコードを記述した類似のクエリが多数あります。しかし、それは動作していないようです。WPFを使用して異なるウィンドウ内の2つのテキストボックス間のデータバインド

MainwindowとWindow1の2つのウィンドウがあります。

  • メインウィンドウには、テキストボックスの名前RUNTIME
  • ウィンドウ1は、テキストボックスのSTOPTIMEを持っています。

メインウィンドウのボタンを押すと、ウィンドウ1が開きます。

2つのテキストボックスの間にバインディングを作成して、RUNTIMEに何かを書き込んでウィンドウ1を開くと、停止時間が同じ値になるようにしたいとします。また、window1を開いてSTOPTIMEに何かを書くと、すぐにRUNTIMEに反映されます。

メインウィンドウには入力ボタンはありませんのでご注意ください。テキストボックスRUNTIMEに書かれているように、変数Timeに保存されます。

メインウィンドウ

 <Window> 
    . 
    . 
    .   
     <TextBox x:Name="RUNTIME" Width="120" Text="{Binding runtime,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 


<MenuItem Header="Menu"> 
<MenuItem Header="SubMenu" Click="set_config_param" StaysOpenOnClick="True"/> 
</MenuItem>      
    . 
    . 
    .    
     </Window> 

ウィンドウ1

 <Window> 
. 
. 
.     
    <TextBox x:Name="STOPTIME" HorizontalAlignment="Left" Height="23" Margin="145,27,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding runtime, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
. 
. 
.     
    </Window> 

時間変数は、ストアランタイム/停止時間に使用されています。私はこれのために別のクラスを作成しました。

public class Time : INotifyPropertyChanged 
public event PropertyChangedEventHandler PropertyChanged; 

     private string _runtime; 

     private void OnPropertyChanged(String property) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 

     public string runtime 
     { 
      get 
      { 
       return _runtime; 
      } 
      set 
      { 
       _runtime = value; 
       OnPropertyChanged("runtime"); 
      } 
     } 
    } 

今やC#コード。

メインウィンドウ

public partial class MainWindow : Window 
     { 
      Time _Time = new Time(); 

      public MainWindow() 
      { 
       InitializeComponent(); 
       RUNTIME.DataContext = _Time; 
    } 

private void set_config_param(object sender, RoutedEventArgs e) 
       { 

        bool isWindowOpen=false; 
foreach (Window w in Application.current.Windows) 

{ 
if (w is Window1) 
{ 
isWindowOpen = true; 
w.Activate(); 
} 
if (!isWindowOpen) 
{ 
Window1 newwindow = new Window(); 
newwindow.Show(); 
} 
}} 
    } 

ウィンドウ1

public partial class Window1 : Window 
     { 
      Time _Time = new Time(); 

      public Window1() 
      { 
       InitializeComponent(); 

       STOPTIME.DataContext = _Time; 
      } 

      private void OK_Window1_Button_Click(object sender, RoutedEventArgs e) 
      { 

       _Time.runtime = STOPTIME.Text; 
      } 

} 

私がこれまで理解している問題は、私は両方の形式で、時間の同じインスタンスをインスタンス化するために失敗したということです。どうやってやるの?正確に私のコードを変更する必要があります。

+0

表示されているコードは存在しないプロパティである「FirstName」にバインドしますあなたが投稿した他のコードのいずれか( 'runtime'プロパティのみがあります)。_also_は、両方のウィンドウで同じモデルオブジェクトを使用するのに失敗した可能性があります( '_Time'がどのように初期化されるかによって異なります)が、問題を確実に再現する良い[mcve]を提供していないので、それが何か他のものが実際には間違っているのかどうかについては言及していない。 –

+0

私は必要な変更を行い、不便をお詫びします。問題が完全にここに記述されていることを確認するために何を含めることができますか?私は変数名などを理解しやすくするために単純化しようとしたため、問題が発生しただけです。 MainWindowの –

+0

に、 '_Time'の新しいインスタンスを作成しています。次にWindow1で、 '_Time'の新しいインスタンスをもう一度作成しています。 'Public Window1()'を 'Public Window1(Time _Time)'に変更し、同じインスタンスを 'Window1 newwindow = new Window1(this._Time) 'に挿入してみてください。 – jayars

答えて

0

がjayars @からのコメントをコピー: 次のような静的クラスにバインドすることができます。次にWindow1で、_Timeの新しいインスタンスをもう一度作成しています。公開Window1()を公開Window1(Time _Time)に変更し、Window1経由で同じインスタンスを挿入してくださいnewwindow = new Window1(this._Time)

0

あなたはそれが間違っているように見えます。あなたの目標はであり、異なるウィンドウ間で同じオブジェクトを共有するです。は、それぞれのウィンドウにアクセスできるどこかに格納されているである必要があります。したがって、これを実装する最も簡単な方法は、シングルトンデザインパターンを使用することです。あなたが_timeの新しいインスタンスを作成している、あなたのメインウィンドウで : ...Text={Binding Path=<Path_on_the_Singleton_object>, Source={x:Static namespace:StaticClass.<Static_Singleton_Property>}}...

+0

は動作していないようです。または構文エラー –

+0

Googleを使用して、構文と実装の詳細を修正できます。私はあなたに一般的な解決策を示しました。 –

関連する問題