使用WPF

时间:2017-05-25 05:29:30

标签: c# wpf data-binding textbox

互联网上有许多类似的查询,我已经编写了以下代码。但它似乎没有起作用。

有两个窗口:Mainwindow和Window1。

  • Mainwindow有一个名为RUNTIME的文本框
  • Window1有一个文本框STOPTIME。

当按下主窗口上的按钮时,window1会打开。

我想在两个文本框之间创建一个绑定,这样如果我在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>

Time变量用于存储运行时/停止时间。我为此创建了一个单独的类。

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;
            }

}

到目前为止我所理解的问题是我无法在两个表单中实例化相同的时间实例。我怎样才能做到这一点?我应该在哪里更改我的代码。

2 个答案:

答案 0 :(得分:0)

我认为你做错了。由于您的目标是在不同的窗口中共享相同的对象,因此必须存储在某个位置,其中每个窗口都可以访问。所以实现这个的最简单方法是使用Singleton设计模式。 您可以绑定到静态类,如下所示: ...Text={Binding Path=<Path_on_the_Singleton_object>, Source={x:Static namespace:StaticClass.<Static_Singleton_Property>}}...

答案 1 :(得分:0)

从@ jayars复制评论: 在您的MainWindow中,您正在创建_Time的新实例。接下来在Window1中,您再次创建_Time的新实例。尝试将公共Window1()修改为公共Window1(Time _Time),并通过Window1 newwindow = new Window1(this._Time)注入相同的实例