编辑DataGrid后保存额外信息

时间:2012-09-04 15:08:03

标签: c# .net wpf entity-framework datagrid

我有DataGridDataGridCheckBoxColumn和其他人。 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();

任何想法?

2 个答案:

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