单击按钮时更新绑定
本文关键字:绑定 更新 按钮 单击 | 更新日期: 2023-09-27 18:31:29
我有一些 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>
我不知道绑定组,但我知道如何以另一种方式做到这一点。
在视图模型中有一个绑定到的对象,就像你现在拥有它一样,并在视图中发生更改时更新它。在对它进行任何更改之前(例如,当您创建它时),请在视图模型中创建对象的深层副本(复制实际值,而不仅仅是引用类型的引用)。
当用户按下"保存"按钮时,只需将更改从有界属性传播到副本,并执行您需要对其执行的任何操作(存储在 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);
}
}