2014-11-23 2 views
0

У меня есть XAML, который привязывается к моим свойствам в модели представления, но я не хочу, чтобы они обновлялись до тех пор, пока пользователь не нажмет кнопку сохранения. После некоторого чтения на MSDN, похоже, я могу использовать BindingGroup.UpdateSources(). Однако я не знаю, как получить элемент контейнера для моего XAML, чтобы одновременно обновлять связанные свойства. Что мне нужно для моего кода?Обновить привязки при нажатии кнопки

Вот мой XAML:

<DockPanel VerticalAlignment="Stretch" Height="Auto"> 
    <Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="2"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" />    
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="Auto" />  
      </Grid.ColumnDefinitions> 

      <Grid.BindingGroup> 
       <BindingGroup Name="myBindingGroup1"> 
       </BindingGroup> 
      </Grid.BindingGroup>     

      <TextBlock Grid.Column="0" Grid.Row="0" Text="Address:" /> 
      <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding myObject.Address, BindingGroupName=myBindingGroup1, UpdateSourceTrigger=Explicit}" /> 

      <TextBlock Grid.Column="0" Grid.Row="1" Text="ID:" /> 
      <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding myObject.ID, BindingGroupName=myBindingGroup1, UpdateSourceTrigger=Explicit}" />    
     </Grid> 
    </Border> 
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" Height="35" HorizontalAlignment="Center" VerticalAlignment="Bottom"> 
     <Button Content="Save" Command="saveItem" /> 
    </StackPanel> 
</DockPanel> 
+0

Вы не нашли ответ полезным? Вы пробовали это вообще? –

+0

Да, это то, что я закончил делать, спасибо. Я принял ваш ответ. – yellavon

+0

Рад, что это вам помогло;) –

ответ

1

Я не знаю, о связывающих групп, но я знаю, как сделать это по-другому.

Имейте объект, с которым вы привязываетесь в своей модели вида, как у вас есть, и пусть он обновляется всякий раз, когда что-то меняется в представлении. Перед любыми изменениями (например, при его создании) создайте глубокую копию объекта (скопируйте фактические значения, а не только ссылки для ссылочных типов) в вашей модели представлений.

Когда пользователь нажимает кнопку «Сохранить», просто распространяйте изменения от ограниченных свойств на копию и выполняйте все, что вам нужно с ней (хранить в db, ...). Если вас не устраивают новые значения, просто перепишите их из копии.

Если ограниченный объект является объектом какой-либо модели, не распространяйте его непосредственно на модель, используйте некоторые временные поля.

Что-то вроде следующего примера.

public class MainViewModel : ViewModelBase 
{ 
    private PersonModel model; 
    private Person person; 

    public Person Person 
    { 
     get { return person; } 
     set { SetField(ref person, value); } // updates the field and raises OnPropertyChanged 
    } 

    public ICommand Update { get { return new RelayCommand(UpdatePerson); } } 

    private void UpdatePerson() 
    { 
     if (someCondition) 
     { 
      // restore the old values 
      Person = new Person(model.Person.FirstName, model.Person.LastName, model.Person.Age); 
     } 

     // update the model 
     model.Person = new Person(Person.FirstName, Person.LastName, Person.Age); 
    } 
} 
Смежные вопросы