如何在使用mvvmLight保存数据后更新dataGrid?

时间:2017-02-20 12:58:25

标签: c# mvvm-light

我正在使用 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?

2 个答案:

答案 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));
    }