c# - 使用 Caliburn Micro 在 WPF 中更新 DataGrid
问题描述
我正在使用 Caliburn Micro 进行 WPF 项目。在这个应用程序中,我有一个DataGrid
,我使用 Dapper 从 SQL Server 数据库中填充数据。请考虑以下代码片段:
ChangesModel.cs
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace PTSRDesktopUI.Models
{
//public class for all changes attributes
public class ChangesModel : INotifyPropertyChanged
{
public int ID { get; set; }
public string Facility { get; set; }
public string Controller { get; set; }
public string ParameterName { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
public DateTime ChangeDate { get; set; }
private bool _validated;
public bool Validated
{
get { return _validated; }
set { _validated= value; NotifyPropertyChanged(); }
}
public DateTime? ValidationDate { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
概述Viewmodel.cs
using Caliburn.Micro;
using PTSRDesktopUI.Helpers;
using PTSRDesktopUI.Models;
namespace PTSRDesktopUI.ViewModels
{
public class OverviewViewModel : Screen
{
//Create new Bindable Collection variable of type ChangesModel
public BindableCollection<ChangesModel> Changes { get; set; }
public OverviewViewModel()
{
//Create connection to dataAccess class
DataAccess db = new DataAccess();
//get the changes from dataAccess function and store them as a bindabla collection in Changes
Changes = new BindableCollection<ChangesModel>(db.GetChangesOverview());
//Notify for changes
NotifyOfPropertyChange(() => Changes);
}
//Validate_Btn click event
public void Validate()
{
//TODO: Change CheckBox boolean value to true and update DataGrid
}
}
}
OverviewView.xaml
<!--Datagrid Table-->
<DataGrid Grid.Row="1" x:Name="Changes" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<!--..........-->
<!--Some irrelevant code-->
<!--..........-->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="Validated_CheckBox" IsChecked="{Binding Path=Validated, UpdateSourceTrigger=PropertyChanged}" IsHitTestVisible ="False"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding Path=ValidationDate, TargetNullValue='NaN',
StringFormat='{}{0:dd.MM HH:mm}'}"/>
<DataGridTemplateColumn CellStyle="{StaticResource DataGridCellCentered}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="Validate_Btn" cal:Message.Attach="[Event Click] = [Action Validate]"
Visibility="{Binding DataContext.Validated,
Converter={StaticResource BoolToVisConverter}, RelativeSource={RelativeSource AncestorType=DataGridCell}}"
cal:Bind.Model="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}">Validate</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我想要完成的是:当用户单击 ValidateButton
时,布尔值CheckBox
设置为 true,ValidationDate
设置为 now 并DataGrid
更新。然后我将触发一个存储过程来更新数据库表。另请注意,只有在选中Button
时才可见。CheckBox
所以我只想知道如何访问该属性Validated
和方法。另外,在更改and的值后,我将如何更新,以便如果我打开另一个,值不会重置?有人有想法么?提前致谢。ValidationDate
ViewModel
Validate()
DataGrid
Validated
ValidationDate
ContentControl
解决方案
在视图模型中更改Validate
方法的签名以接受ChangesModel
:
public void Validate(ChangesModel model)
{
model.ChangeDate = DateTime.Now;
}
...并将您的 XAML 标记更改为:
<Button x:Name="Validate_Btn"
cal:Message.Attach="[Event Click] = [Action Validate($this)]"
cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}"
Visibility="...">Validate</Button>
要刷新 中的数据DataGrid
,您还需要为属性引发PropertyChanged
事件:ChangeDate
private DateTime _changeDate;
public DateTime ChangeDate
{
get { return _changeDate; }
set { _changeDate = value; NotifyPropertyChanged(); }
}
推荐阅读
- php - 错误:SQLSTATE[HY000] [1049] 在“.env”中定义了一个新数据库时,未知数据库“old_db”
- css - 如何通过单击按钮运行多个 css 转换?
- javascript - 将输入日期格式从 MM.DD.YYYY 切换为 DD.MM.YYYY 格式 dialogFlow
- perl - 在模板文件的表达式中使用未初始化的变量时出错
- javascript - Angular 自定义焦点指令。聚焦表单的第一个无效输入
- r - 连接:Oracle Autonomous DB 和 R - ROracle 包问题
- java - 如何修复 cipher.doFinal 方法中的“解密过程”
- c# - 当您需要在调用时访问其参数时如何使用 Func?
- python - 如何使用 Zeep 和 Python 3.7 捕获错误
- suitetalk - 我们如何使用 java 使用 TransactionSearchAdvanced 获取任何记录的 url