我在更新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模式,因此我没有任何代码隐藏。
感谢任何帮助。
答案 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可以帮助您。它提供了一种动态的方式来添加这样的包装器。