打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(WPF)对话框中的数据绑定
userphoto

2007.05.16

关注


    今天我将介绍如何对“对话框”进行数据绑定。需求很简单,点击ok按钮时使用数据绑定确定用户的变更,点击cancel按钮时取消更改

 

一种方法是当用户在对话框内更改信息时使用绑定来更新数据源,如果点击cancel按钮则撤销绑定。不过我不太喜欢这种cancel的方法,因为数据源需要的只是一个临时的值。而且对话框启动时需要记住数据;点击cancel按钮时还需要还原数据,应用程序要想实现这些功能就需要添加额外的逻辑。这可是个烦人的事。幸运的是还有个简单的方法:改变UpdateSourceTrigger属性的值
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

主窗体内包含一个按钮,用来启动对话框。窗体内的其他标签用来显示数据。程序启动时标签里没有内容。用户打开对话框,在文本框里输入数据后点击ok,主窗体内标签的值就会用户输入的内容。如果点击cancel按钮,标签的值不会改变


    <Button Click="ShowDialog" Width="100" Height="30">Show Dialog</Button>
    <Label Grid.Row="0" Grid.Column="1" Name="Name" Margin="5" Content="{Binding Source={StaticResource source}, Path=Name}"/>
    <Label Grid.Row="1" Grid.Column="1" Name="Comment" Margin="5" Content="{Binding Source={StaticResource source}, Path=Comment}"/>

    private void ShowDialog(object sender, RoutedEventArgs args)
    {
        Dialog1 dialog = new Dialog1();
        dialog.Owner = this;
        dialog.ShowDialog();
    }

对话框包含两个文本框和Ok/Cancel按钮。这两个文本框的数据源和彼此的应标签的数据源相同。下面是话框的xaml代码

    <TextBox Grid.Row="0" Grid.Column="1" Name="Name" Margin="5" Text="{Binding Source={StaticResource source}, Path=Name, UpdateSourceTrigger=Explicit}"/>
    <TextBox Grid.Row="1" Grid.Column="1" Name="Comment" Margin="5" Text="{Binding Source={StaticResource source}, Path=Comment, UpdateSourceTrigger=Explicit}"/>
    <Button Click="OKHandler" IsDefault="true" Margin="5">OK</Button>
    <Button IsCancel="true" Margin="5">Cancel</Button>
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

BindingUpdateSourceTrigger属性允许我们指定触发升级数据源的方式文本框TextProperty属性对应的UpdateTrigger默认值为LostFocus:当TextBox失去焦点时就会对数据源进行更新。该方式不适合这个程序。我们只想在用户点击ok按钮时才更新数据源。将UpdateSourceTrigger的值改为Explicit,这样我们就可以在ok按钮的事件里显示地调用BindingExpressionUpdateSource()方法来更新数据源了。

    private void OKHandler(object sender, RoutedEventArgs args)
    {
        BindingExpression bindingExpressionName = BindingOperations.GetBindingExpression(Name, TextBox.TextProperty);
        bindingExpressionName.UpdateSource();
        BindingExpression bindingExpressionComment = BindingOperations.GetBindingExpression(Comment, TextBox.TextProperty);
        bindingExpressionComment.UpdateSource();
        this.DialogResult = true;
    }
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

Ok按钮的逻辑比较简单。但Cancel按钮更简单。我们不关心数据源的更新,仅仅关闭窗体就可以了:只要将按钮的IsCancel属性设置为true就可以了,不需要进行事件的编码

下面是该程序的截图:
<!--[if !vml]-->

<!--[endif]-->
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

原文地址:How do I implement a data bound dialog box?


<!--[endif]-->

译者注:Beatriz Costa写本文时的winfx版本是BETA 1,现在已经不能使用了。我改动了部分代码。放在这里供大家下载

代码下载

译者注:大多数的dependency Property对应的UpdateSouceTrigger值为PropertyChanged,但TextBox的TextProperty对应的值为LostFocus

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
白话 WPF/SL 绑定(Binding)
VFP的表格透析 [IT行内话]
使用WPF提供的数据验证机制
Silverlight实例教程 - Validation用户提交数据验证捕获
如何调用VS自带的数据源选择对话框 - 纶巾客 - 博客园
VFP使用表缓冲
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服