如何停止更新绑定属性?

时间:2009-05-27 05:59:47

标签: wpf binding

我的应用程序中有一个对话框弹出主屏幕(它实际上是一个用户控件,根据Billy Hollis的应用程序演示显示在页面上),该应用程序包含要编辑的主屏幕中的数据。主屏幕是只读的。

我遇到的问题是,当我更改对话框中的数据时,主屏幕上的数据也会更新。显然,它们绑定到同一个对象,但有没有办法停止绑定更新,直到我在对话框中单击“保存”?

3 个答案:

答案 0 :(得分:10)

您可以使用BindingGroup

...
<StackPanel Name="panel">
    <StackPanel.BindingGroup>
        <BindingGroup Name="bindingGroup"/>
    </StackPanel.BindingGroup>
    <TextBox Text="{Binding Foo}"/>
    <TextBox Text="{Binding Bar}"/>
    <Button Name="btnSubmit" Content="Submit" OnClick="btnSubmit_Click"/>
    <Button Name="btnCancel" Content="Cancel" OnClick="btnCancel_Click"/>
</StackPanel>
...

代码背后:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    panel.BindingGroup.BeginEdit();
}

private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
    panel.BindingGroup.CommitEdit();
    panel.BindingGroup.BeginEdit();
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    panel.BindingGroup.CancelEdit();
    panel.BindingGroup.BeginEdit();
}

答案 1 :(得分:3)

查看Binding.UpdateSourceTrigger属性。

您可以在对话框中设置Binding

<TextBox Name="myTextBox" 
    Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit} />

然后在按钮保存事件中调用UpdateSource方法

myTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();

调用UpdateSource后,将使用TextBox

中的值更新源对象

答案 2 :(得分:0)

我也选择使用BindingGroup。但是,我没有BeginEdit() / CommitEdit() / CancelEdit()模式,而是在与BindingGroup关联的所有绑定上显式调用UpdateSource()。这种方法允许我只添加一个事件处理程序而不是3。

private void OkButton_Click(object sender, RoutedEventArgs e)
{
    CommitChanges();
    DialogResult = true;
    Close();
}

private void CommitChanges()
{
    foreach (var bindingExpression in this.BindingGroup.BindingExpressions)
    {
        bindingExpression.UpdateSource();
    }
}