您的位置:首页 > 其它

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

2017-05-31 19:18 246 查看
本示例包含两个窗口,主窗口为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();

        }

$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wpf 数据绑定