我的应用程序中有一个对话框弹出主屏幕(它实际上是一个用户控件,根据Billy Hollis的应用程序演示显示在页面上),该应用程序包含要编辑的主屏幕中的数据。主屏幕是只读的。
我遇到的问题是,当我更改对话框中的数据时,主屏幕上的数据也会更新。显然,它们绑定到同一个对象,但有没有办法停止绑定更新,直到我在对话框中单击“保存”?
答案 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();
}
}