2009-05-27 1 views
9

У меня есть диалог, который появляется на главном экране (это фактически элемент управления пользователя, который появляется на странице в соответствии с демонстрацией приложения от Billy Hollis) в моем приложении, которое имеет данные с главного экрана для редактирования. Основной экран доступен только для чтения.Как прекратить связывание свойств с обновления?

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

ответ

10

Вы можете использовать :

... 
<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(); 
} 
+0

Отличная идея! Я получил эту работу только в том случае, если я объявлял группу в каждом обязательном заявлении. Это, однако, намного проще, чем другие альтернативы. – Telavian

0

Они только так, как я видел, как это делается, как Джош Смит упоминает here с преобразователями. Однако не самый простой способ.

3

Посмотрите на Binding.UpdateSourceTrigger Недвижимость.

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

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

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

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

После того, как вы назвали UpdateSource исходный объект будет обновлено со значением TextBox

+0

Я пробовал это, но он не работает. Он по-прежнему обновляет TextBlock на главном экране. Опция Explicit указывает, что она будет обновляться только при вызове метода UpdateSource, но не в этом случае. – 2009-05-28 04:12:35

+0

Действительно? Я удивлен. Я просто попробовал, и это работает для меня. Может быть, что-то еще в вашем приложении вызывает проблемы? – Ray

+0

Это определенно работает, но вы должны перебирать все привязки, чтобы называть UpdateSource() для каждого. Самый простой способ сделать это - связать привязки с одной BindingGroup. В качестве бонуса вы получаете UpdateSourceTrigger, установленным явно для связанных привязок. – Lu55

0

Я также хочу использовать BindingGroup. Но вместо BeginEdit()/CommitEdit()/CancelEdit() pattern Я вызываю 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(); 
    } 
}