在DataGrid中更改属性时调用方法

时间:2017-08-25 22:59:17

标签: c# wpf mvvm datagrid

我在更新DataGrid中的一个字段时尝试调用方法。现在,我尝试了多个不同的选项,但是没有人会调用我创建的方法或DelegateCommand。 这是我的DataGrid的代码:

<DataGrid x:FieldModifier="public" x:Name="Classes" CanUserAddRows="False" AutoGenerateColumns="False" CanUserResizeColumns="False" AlternatingRowBackground="LightBlue" ItemsSource="{Binding Classes, Mode=TwoWay}" SelectedItem="{Binding SelectedClass}" >
        <DataGrid.Columns>
            <DataGridTextColumn Width="200" Header="Class" Binding="{Binding Class, Mode=TwoWay}" IsReadOnly="True"/>
            <DataGridTextColumn Width="200" Header="Semester" Binding="{Binding Semester, Mode=TwoWay}" IsReadOnly="True"/>
            <DataGridTextColumn Width="200" Header="Date Due" Binding="{Binding Date_Due, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
            <DataGridTextColumn Width="200" Header="Importance" Binding="{Binding Importance, Mode=TwoWay}" IsReadOnly="True"/>
        </DataGrid.Columns>
    </DataGrid>

数据网格绑定到我创建的对象的Observable集合。 当用户更新Date_Due字段时,我想在我的ViewModel中调用一个方法来更新数据库。我该怎么做呢?

我正在使用MVVM模式,因此我没有任何代码隐藏。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用一个执行特殊逻辑的薄层(更新数据库)来包装所有ClassInfo - 数据对象(集合中的对象)。

// Your data object
public class ClassInfo
{
    public string Class { get; set; }
    public string Semester { get; set; }
    public DateTime Due { get; set; }
    public string Importance { get; set; }
}

// something that takes care of the update
public interface IDatabase
{
    void SendClassInfoUpdate(ClassInfo ci);
}

// a thin wrapper
public class ClassInfoViewModel
{
    IDatabase _db;
    ClassInfo _ci;

    public ClassInfoViewModel(IDatabase db, ClassInfo ci)
    {
        _db = db;
        _ci = ci;
    }

    public string Class
    {
        get => _ci.Class;
        set => _ci.Class = value;
    }
    public string Semester
    {
        get => _ci.Semester;
        set => _ci.Semester = value;
    }
    public DateTime Due
    {
        get => _ci.Due;
        set
        {
            _ci.Due = value;
            _db.SendClassInfoUpdate(_ci);
        }
    }
    public string Importance
    {
        get => _ci.Importance;
        set => _ci.Importance = value;
    }
}

视图不知道它正在处理你的包装器。这也是阻止对属性进行访问,添加“仅查看”属性(计算属性)等的好方法。如果你正在做INPC,你也必须代理它。

您会看到许多代码仅用于代理对内部对象的调用。例如,Castle.DynamicProxy可以帮助您。它提供了一种动态的方式来添加这样的包装器。