Как остановить обновление свойств привязки? - PullRequest
9 голосов
/ 27 мая 2009

У меня есть диалоговое окно, которое появляется на главном экране (на самом деле это пользовательский элемент управления, который появляется на странице в соответствии с демонстрацией приложения от Билли Холлиса) в моем приложении, в котором есть данные с главного экрана, которые нужно редактировать. Главный экран только для чтения.

Проблема, с которой я столкнулся, заключается в том, что при изменении данных в диалоговом окне данные на главном экране также обновляются. Очевидно, что они связаны с одним и тем же объектом, но есть ли способ остановить обновление привязки, пока я не нажму кнопку «Сохранить» в моем диалоговом окне?

Ответы [ 3 ]

10 голосов
/ 27 мая 2009

Вы можете использовать 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();
}
3 голосов
/ 27 мая 2009

Обратите внимание на свойство Binding.UpdateSourceTrigger .

Вы можете установить Binding в вашем диалоге, например,

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

А затем вызовите метод UpdateSource в событии сохранения кнопки

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

Как только вы позвоните UpdateSource, исходный объект будет обновлен на значение из TextBox

0 голосов
/ 24 ноября 2012

Я также решил использовать BindingGroup . Но вместо шаблона BeginEdit() / CommitEdit() / CancelEdit() я вызываю UpdateSource() явно для всех привязок, связанных с BindingGroup. Этот подход позволяет мне добавить только один обработчик событий вместо 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...