【问题标题】:How do I stop binding properties from updating?如何停止更新绑定属性?
【发布时间】:2013-07-31 05:17:53
【问题描述】:

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

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

【问题讨论】:

标签: wpf binding


【解决方案1】:

您可以使用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();
}

【讨论】:

  • 好主意!如果我在每个绑定语句中声明了组,我只会得到这个工作。但是,这比其他选择要容易得多。
【解决方案2】:

查看Binding.UpdateSourceTrigger 属性。

您可以像这样在对话框中设置Binding

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

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

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

一旦你调用了UpdateSource,源对象就会更新为TextBox中的值

【讨论】:

  • 我试过这个,但它不起作用。它仍然会更新主屏幕上的 TextBlock。 Explicit 选项确实声明它只会在调用 UpdateSource 方法时更新,但在这种情况下不会更新。
  • 真的吗?我很惊讶。我刚试过,它对我有用。也许您的应用程序中还有其他问题导致了问题?
  • 它确实有效,但您应该遍历所有绑定,以便在每个绑定上调用 UpdateSource()。最简单的方法是将绑定关联到一个 BindingGroup。作为奖励,您可以在关联绑定上隐式地将 UpdateSourceTrigger 设置为 Explicit。
【解决方案3】:

我也选择使用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();
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多