WPF DataGrid绑定Realm对象:自动完成框选择后无法更新对象与UI
解决WPF DataGrid绑定Realm对象时自动完成框选择后UI不更新的问题
我之前在做WPF+Realm的项目时也踩过完全一样的坑!你说的现象太典型了——Realm的托管对象必须在写入事务中修改属性,不然你的修改既不会被持久化,也不会触发UI的变更通知,这就是为什么选完账号后框变空、源对象也没更新的原因。
下面给你具体的解决方案,分两种常用场景:
一、代码后置(直接处理UI事件)
- 先给自动完成框绑定
SelectionChanged事件,在事件处理方法里开启Realm写入事务:
<DataGridTemplateColumn Header="账号"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <AutoCompleteBox ItemsSource="{Binding AvailableAccounts}" SelectedItem="{Binding SelectedAccount, Mode=TwoWay}" SelectionChanged="AccountAutoComplete_SelectionChanged"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
- 后台事件处理代码:
private void AccountAutoComplete_SelectionChanged(object sender, SelectionChangedEventArgs e) { var autoComplete = sender as AutoCompleteBox; // 获取当前行绑定的Realm对象 var targetObject = autoComplete.DataContext as YourRealmEntity; var selectedAccount = autoComplete.SelectedItem as AccountModel; if (targetObject != null && selectedAccount != null) { // 关键:在写入事务中修改属性 using (var transaction = targetObject.Realm.Write()) { targetObject.Account = selectedAccount; // using块结束时会自动提交事务,也可以手动调用transaction.Commit() } } }
二、MVVM模式(推荐)
如果用MVVM架构,把事务逻辑放到ViewModel里,通过命令绑定自动完成框的选择事件:
- ViewModel里的命令和属性:
// 当前DataGrid行绑定的Realm对象 public YourRealmEntity CurrentItem { get; set; } // 自动完成框的选择命令 public ICommand AccountSelectedCommand => new RelayCommand<AccountModel>(selectedAccount => { if (CurrentItem == null || selectedAccount == null) return; using (var transaction = CurrentItem.Realm.Write()) { CurrentItem.Account = selectedAccount; } });
- XAML绑定命令(这里用Microsoft.Xaml.Behaviors实现事件转命令):
<DataGridTemplateColumn Header="账号"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <AutoCompleteBox ItemsSource="{Binding AvailableAccounts}" SelectedItem="{Binding CurrentItem.Account, Mode=TwoWay}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding DataContext.AccountSelectedCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource Self}}"/> </i:EventTrigger> </i:Interaction.Triggers> </AutoCompleteBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
关键注意点
- 一定要确保修改Realm对象属性的操作在
Write()事务块内,Realm的变更通知机制只有在事务提交后才会触发UI更新 - 事务要尽量简短,不要在事务里做耗时操作,避免阻塞UI线程
- 如果你绑定的是Realm的查询结果(比如
realm.All<YourEntity>()),Realm会自动监听变更并更新集合,不需要手动刷新DataGrid
这样处理之后,你选择账号时,修改会被持久化到Realm,同时UI也会同步显示选中的账号,不会再出现框变空的情况啦!
内容的提问来源于stack exchange,提问作者mack
相关产品推荐
相关产品推荐

