随笔 - 229  文章 - 2  评论 - 511  阅读 - 84万

对话框中的数据绑定(WPF)


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

 

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

主窗体内包含一个按钮,用来启动对话框。窗体内的其他标签用来显示数据。程序启动时标签里没有内容。用户打开对话框,在文本框里输入数据后点击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>

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

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

下面是该程序的截图:


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


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

代码下载

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

posted on   stswordman  阅读(3535)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2006年12月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示