六、两个窗口间的数据绑定

本示例包含两个窗口,主窗口为MainWindow类,外加一个自定义窗口MyDialog(当作自定义对话框)。主窗口中有一个TextBlock控件和一个Button控件,当点击按钮后会打开MyDialog对话框,对话框中有一个ComboBox控件,当用户在ComboBox控件中选择项时,会同步更新主窗口中TextBlock的显示文本。

即,将MainWindow.TextBlock对象的Text属性和MyDialog中的ComboBox控件的SelectedItem属性进行绑定。Text属性自动从SelectedItem属性中取值。

 

为了让MyDialog窗口能够访问主窗口中的TextBlock对象,所以XAML要这样写:

<TextBlock Name="tbtxt" x:FieldModifier="public" Margin="10"/>
        <Button Content="打开对话框" Click="OnOpenDialog"/>
然后,设计MyDialog的界面,声明ComboBox对象,并添加几个选项。

 <ComboBox Name="cmb" >
            <sys:String>飞机</sys:String>
            <sys:String>坦克</sys:String>
            <sys:String>火车</sys:String>
            <sys:String>轮船</sys:String>
            <sys:String>大卡车</sys:String>
            <sys:String>拖拉机</sys:String>
            <sys:String>装甲车</sys:String>
        </ComboBox>
        <Button HorizontalAlignment="Center" Grid.Row="1" Margin="0,20" Content="OK" Click="OnClick"/>
接着,在MyDialog类的构造函数中通过代码来设置Binding。

public MyDialog(Window owner)
        {
            this.Owner = owner;
            InitializeComponent();

            // 设置Binding对象
            Binding b = new Binding();
            b.Path = new PropertyPath(ComboBox.SelectedItemProperty);
            b.Source = cmb;
            b.Mode = BindingMode.OneWay;
            b.StringFormat = "您选择的交通工具为:{0}";

            MainWindow mw = Owner as MainWindow;
            // 使属性与Binding关联
            mw?.tbtxt.SetBinding(TextBlock.TextProperty, b);
        }

Window类有一个Owner属性,可以设置它的父窗口,这里,MyDialog作为弹出窗口,MainWindow作为父窗口,因此在实例化MyDialog时传递owner,使得代码能访问MainWindow。我这里为了方便省事,直接写了个带参数的构造函数。

注意此处的绑定,数据源是ComboBox控件,数据使用者是TextBlock,所以Binding的Source应为cmb实例,Path直接用依赖项属性标识即可。

最后调用TextBlock对象的SetBinding方法就可以设置Binding了。

 

为啥不用XAML来binding呢,因为这是跨窗口的绑定,用XAML很难写,用代码来写反而好处理。

运行程序,然后打开对话框,在对话框中选一个项,你会看到,父窗口中的显示文本会自动更新。

主窗口调用:

 private void OnOpenDialog(object sender, RoutedEventArgs e)
        {
            MyDialog mydialog = new MyDialog(this);
            mydialog.Show();
        }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaFX中,可以通过以下方式在两个窗口传输数据: 1. 使用构造函数传递数据。在第二个窗口的构造函数中,可以将第一个窗口中的数据作为参数传递进去。例如: ``` // 第一个窗口中的代码 String data = "Hello World"; SecondWindow secondWindow = new SecondWindow(data); // 第二个窗口中的代码 public SecondWindow(String data) { // 处理传递过来的数据 } ``` 2. 使用属性传递数据。在第二个窗口中,可以创建一个属性并将其绑定到第一个窗口中的数据。例如: ``` // 第一个窗口中的代码 StringProperty data = new SimpleStringProperty("Hello World"); SecondWindow secondWindow = new SecondWindow(); secondWindow.setData(data); // 第二个窗口中的代码 private StringProperty data; public void setData(StringProperty data) { this.data = data; // 处理传递过来的数据 } ``` 3. 使用事件传递数据。在第一个窗口中,可以创建一个自定义事件并将其触发,第二个窗口中可以监听该事件并获取传递的数据。例如: ``` // 第一个窗口中的代码 public class DataEvent extends Event { public static final EventType<DataEvent> DATA_EVENT_TYPE = new EventType<>(Event.ANY, "DATA_EVENT"); private String data; public DataEvent(String data) { super(DATA_EVENT_TYPE); this.data = data; } public String getData() { return data; } } DataEvent event = new DataEvent("Hello World"); Event.fireEvent(secondWindow, event); // 第二个窗口中的代码 secondWindow.addEventHandler(DataEvent.DATA_EVENT_TYPE, event -> { String data = event.getData(); // 处理传递过来的数据 }); ``` 希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值