0

我有一个DataGrid和一个DataGridCheckBoxColumn和其他人。被DataGrid ItemSource映射到ObservableCollection包含 的行的a Tasks。Task 类包括属性,例如"ID", "IsScheduled", "IsScheduled_Date", "IsScheduled_EditorID", Etc. 我试图弄清楚如何使一个DataGridCheckBoxColumn字段 ( IsScheduled) 还保存日期 ( IsScheduled_Date) 以及在选中时谁进行了更改 ( IsScheduled_EditorID)。

(1) 我曾尝试使用多重绑定来保存额外的数据,但到目前为止我的努力都失败了。您可以在此处查看解决类似问题的进度。

(2) 我曾尝试让DataGrid CellEditEnding事件保存额外数据,但它最终在提交 IsScheduled 数据之前提交了额外数据,并且每当取消行和/或单元格编辑时都会造成麻烦。

(3) 我尝试在我的 Task 类中监听属性更改事件并在那里分配额外的更改。这似乎工作正常,直到我意识到当数据首次加载时它会导致覆盖任何早期更改的更改事件。

添加信息


该类TaskEntity Framework Class从数据库生成的。我正在收听该OnIscheduledChanged事件并进行必要的更改,因为当我在生成的类中进行更改时,它总是被覆盖。

更多信息


Task 类似乎有些混乱。正如我所说,它是由实体框架生成的,断点显示加载时调用的设置器......覆盖更改。更不用说每次代码重新生成时都会覆盖任何自定义代码。

    /// <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();

有任何想法吗?

4

2 回答 2

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;
    }
}
于 2012-10-23T12:32:59.363 回答
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> 
于 2012-09-04T16:07:45.257 回答