对话框中的数据绑定(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

原文地址:https://www.cnblogs.com/stswordman/p/605474.html