我有DataGrid
个DataGridCheckBoxColumn
和其他人。 DataGrid ItemSource
已映射到包含ObservableCollection
行的Tasks
。 Task类包含"ID", "IsScheduled", "IsScheduled_Date", "IsScheduled_EditorID", Etc.
等属性我试图计算如何创建一个DataGridCheckBoxColumn
字段(IsScheduled
)也保存日期(IsScheduled_Date
)以及进行更改的人(IsScheduled_EditorID
)选中时。
(1)我试图使用multibinding来保存额外的数据,但到目前为止我的努力都失败了。您可以通过解决类似问题Here来了解我的进度。
(2)我已经尝试将DataGrid
CellEditEnding
事件保存为额外数据但最终在提交IsScheduled数据之前提交了额外数据,并且每当行和/或单元格都会出现问题编辑被取消了。
(3)我尝试在我的Task类中监听属性更改事件,并在那里分配其他更改。这似乎工作正常,直到我意识到当数据首次加载时,它会导致更改事件覆盖任何先前的更改。
Task
类是从数据库生成的Entity Framework Class
。我正在听OnIscheduledChanged
事件并进行必要的更改,因为当我在生成的类中执行它时,它总是被覆盖。
对Task类似乎有些困惑。正如我所说,它是由实体框架生成的,断点显示在加载时调用setter ...覆盖更改。更不用说每次代码重新生成时都会覆盖任何自定义代码。
/// <summary> /// No Metadata Documentation available. /// </summary> [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] [DataMemberAttribute()] public global::System.Boolean IsScheduled { get { return _IsScheduled; } set { OnIsScheduledChanging(value); ReportPropertyChanging("IsScheduled"); _IsScheduled = StructuralObject.SetValidValue(value); ReportPropertyChanged("IsScheduled"); OnIsScheduledChanged(); } } private global::System.Boolean _IsScheduled; partial void OnIsScheduledChanging(global::System.Boolean value); partial void OnIsScheduledChanged();
任何想法?
答案 0 :(得分:0)
在课堂上进行
public partial class MainWindow : Window
{
public ObservableCollection<xxx> xxxs { get; private set; }
public MainWindow()
{
xxxs = new ObservableCollection<xxx>();
xxxs.Add(new xxx("Mike", false));
xxxs.Add(new xxx("Sarah", true));
InitializeComponent();
}
public class xxx: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private bool isChecked;
public bool IsChecked
{
get { return isChecked; }
set
{
if (isChecked == value) return;
if (value) FirstName = DateTime.Now.ToString(); else FirstName = string.Empty;
// update db
isChecked = value;
NotifyPropertyChanged("FirstName");
}
}
public string FirstName { get; private set; }
public xxx(string firstName, bool _isChecked) { FirstName = firstName; isChecked = _isChecked; }
}
}
DataContext="{Binding RelativeSource={RelativeSource self}}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="MyGrid" ItemsSource="{Binding Path=xxxs}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="CheckBox" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<DataGridTextColumn Header="Text" Binding="{Binding FirstName, Mode=OneWay}"/>
</DataGrid.Columns>
</DataGrid>
答案 1 :(得分:0)
我最终为暴露相同属性的实体模型创建了一个ViewModel类。我将DataGrid ItemSource绑定到包装的任务模型列表(例如下面)。 [显然这是显示属性的快速示例类,需要属性通知才能正常工作]
Class TaskViewModel
{
private Task task;
public Boolean IsScheduled
{
get
{
return task.IsScheduled;
}
set
{
this.task.IsScheduled = value;
this.task.IsScheduledDate = Date.Now();
}
TaskViewModel(Task task)
{
this.task = task;
}
}