对话框中的数据绑定(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>
Binding类的UpdateSourceTrigger属性允许我们指定触发升级数据源的方式。文本框TextProperty属性对应的UpdateTrigger默认值为”LostFocus”:当TextBox失去焦点时就会对数据源进行更新。该方式不适合这个程序。我们只想在用户点击ok按钮时才更新数据源。将UpdateSourceTrigger的值改为”Explicit”,这样我们就可以在ok按钮的事件里显示地调用BindingExpression的UpdateSource()方法来更新数据源了。
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,现在已经不能使用了。我改动了部分代码。放在这里供大家下载
代码下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现