0

私はと他DataGridの人と一緒にDataGridCheckBoxColumnいます。は、の行を含むにDataGrid ItemSourceマップされます。Taskクラスには 、1つのフィールド()を作成する方法や日付()を保存する方法、チェックしたときに誰が変更()を行ったかなどのプロパティが含まれています。ObservableCollectionTasks"ID", "IsScheduled", "IsScheduled_Date", "IsScheduled_EditorID", Etc.DataGridCheckBoxColumnIsScheduledIsScheduled_DateIsScheduled_EditorID

(1)マルチバインディングを使用して余分なデータを保存するように試みましたが、これまでのところ失敗しています。ここで、同様の問題の解決に関する私の進捗状況を確認できます。

(2)DataGrid CellEditEndingイベントに追加データを保存させようとしましたが、IsScheduledデータがコミットされる前に追加データをコミットすることになり、行やセルの編集がキャンセルされるたびに問題が発生しました。

(3)Taskクラスでプロパティ変更イベントをリッスンし、そこで追加の変更を割り当ててみました。これは、データが最初にロードされたときに、以前の変更を上書きする変更イベントが発生することに気付くまでは、正常に機能しているように見えました。

追加情報


Taskクラスは、Entity Framework ClassDBから生成されたものです。生成されたクラスでイベントを実行すると、常に上書きされるため、イベントを聞いてOnIscheduledChanged必要な変更を加えていました。

より詳しい情報


Taskクラスについては混乱があるようです。私が述べたように、それはEntity Frameworkによって生成され、ブレークポイントはロード時に呼び出されているセッターを示します...変更を上書きします。コードが再生成されるたびに上書きされるカスタムコードは言うまでもありません。

    /// <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

クラスでやる

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 に答える
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 に答える