我正在使用 mvvmLight-framework 。我有两个用户控件。
一个usercontrol(objectInspector)用于保存数据:
<Button Command="{Binding ObjectModel.OkCommand}" />
它绑定到视图模型“objectInspectorViewModel”。
另一个usercontrol(outliner)用于加载/显示所有数据
<DataGrid ItemsSource="{Binding Path=ObjectModels, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Grid.Row="0"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" Header="ID"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Name}" Header="Name"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Length}" Header="Length"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Height}" Header="Height"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Width}" Header="Width"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Type}" Header="Type"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
它绑定到viewmodel“outlinerViewModel”。
加载和保存工作正常。但我想要的是在保存新对象后刷新数据网格。
我的OutlinerViewModel看起来像这样:
public class OutlinerViewModel : BaseViewModel
{
public List<ObjectModel> ObjectModels { get; set; }
public OutlinerViewModel()
{
string file = $@"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName}\DataSource\objects.csv";
ObjectModels = ReadFile(file);
}
[...]
}
My ObjectInspectorViewModel如下所示:
public class ObjectInspectorViewModel : BaseViewModel
{
public ObjectModel ObjectModel { get; set; } = new ObjectModel();
}
这是从ObjectModel将新对象保存到''数据库''的方法:
public RelayCommand OkCommand { get; private set; }
protected override void InitCommands()
{
base.InitCommands();
OkCommand = new RelayCommand(
() =>
writeToCsv(
$@"{Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName}\DataSource\objects.csv",
this.ToString()),
() => IsOk);
}
如何在使用MvvmLight保存数据后更新dataGrid?
答案 0 :(得分:2)
Personnaly,我喜欢让我的视图与数据库中的数据保持同步。 因此,当我保存元素时,我通过从那里检索数据来刷新数据网格。 这样,您就没有同步问题。如果性能很重要,您可以尝试仅更新您保存的元素。 因此,在您的情况下,我只需在保存对象后调用“readFile”方法。
顺便说一句,所有的ObjectModel属性都应该在ViewModel中调用RaisePropertyChanged:
这样的事情:
private long IdProperty;
public long Id
{
get { return IdProperty; }
set { IdProperty = value; RaisePropertyChanged(() => Id); }
}
private long NameProperty;
public long Name
{
get { return NameProperty; }
set { NameProperty = value; RaisePropertyChanged(() => Name); }
}
这样,所有属性在修改时都会在视图中更新。 (RaisePropertyChanged附带ViewModelBase类)
答案 1 :(得分:1)
将您的List<ObjectModel>
更改为ObservableCollection<ObjectModel>
。
应该那么简单。
<强>更新强>
另外,举起PropertyChanged
。
private ObservableCollection<ObjectModel> objectModels;
public ObservableCollection<ObjectModel> ObjectModels
{
get
{
return onjectModels;
}
set
{
objectModels = value;
OnPropertyChanged();
}
}
假设您的视图模型实现了INotifyPropertyChanged。它可以像这样实现。
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}