0

私のアプリケーションでは、プログラムでデータグリッドを生成し、それをリストにバインドしています。データグリッドでデータを表示できますが、セルを編集すると、リストの基になるアイテムが更新されません。これがコードです

Window dateChangeWindow = new Window();
dateChangeWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dateChangeWindow.Owner = Application.Current.MainWindow;
dateChangeWindow.SizeToContent = SizeToContent.WidthAndHeight;
dateChangeWindow.Title = "Date Change";

StackPanel stackPanel = new StackPanel();
stackPanel.Orientation = Orientation.Vertical;

DataGrid requestGrid = new DataGrid();
requestGrid.CanUserResizeColumns = false;
requestGrid.CanUserResizeRows = false;
requestGrid.CanUserReorderColumns = false;
requestGrid.CanUserSortColumns = true;
requestGrid.AutoGenerateColumns = false;

DataGridTextColumn requestIdColumn = new DataGridTextColumn();
requestIdColumn.Header = "Request Id";
Binding idBinding = new Binding("RequestId");
idBinding.Mode = BindingMode.OneWay;
requestIdColumn.Binding = idBinding;
requestGrid.Columns.Add(requestIdColumn);

DataGridTemplateColumn startDateColumn = new DataGridTemplateColumn();
startDateColumn.Header = "Start Date";
Binding startDateBinding = new Binding("StartDate");
startDateBinding.Mode = BindingMode.TwoWay;
FrameworkElementFactory startDateFactory = new FrameworkElementFactory(typeof(DatePicker));
startDateFactory.SetBinding(DatePicker.SelectedDateProperty, startDateBinding);
DataTemplate startDateTemplate = new DataTemplate();
startDateTemplate.VisualTree = startDateFactory;
startDateColumn.CellTemplate = startDateTemplate;
startDateColumn.CellEditingTemplate = startDateTemplate;
requestGrid.Columns.Add(startDateColumn);

DataGridTemplateColumn endDateColumn = new DataGridTemplateColumn();
endDateColumn.Header = "End Date";
Binding endDateBinding = new Binding("EndDate");
endDateBinding.Mode = BindingMode.TwoWay;
FrameworkElementFactory endDateFactory = new FrameworkElementFactory(typeof(DatePicker));
endDateFactory.SetBinding(DatePicker.SelectedDateProperty, endDateBinding);
DataTemplate endDateTemplate = new DataTemplate();
endDateTemplate.VisualTree = endDateFactory;
endDateColumn.CellTemplate = endDateTemplate;
endDateColumn.CellEditingTemplate = endDateTemplate;
requestGrid.Columns.Add(endDateColumn);

requestGrid.ItemsSource = requestList;
requestGrid.Margin = new Thickness(0, 10, 0, 0);
requestGrid.HorizontalAlignment = HorizontalAlignment.Center;

stackPanel.Children.Add(requestGrid);

Button changeDoneBtn = new Button();
changeDoneBtn.Content = "Submit";
changeDoneBtn.Click += new RoutedEventHandler(changeDone_Click);
changeDoneBtn.Margin = new Thickness(0, 20, 0, 10);
changeDoneBtn.HorizontalAlignment = HorizontalAlignment.Center;

stackPanel.Children.Add(changeDoneBtn);

dateChangeWindow.Content = stackPanel;
dateChangeWindow.ShowDialog();

ItemsSourcerequestListは、ウィンドウの作成前に入力されます。それは次のように宣言されています

IList<DateChangeWrapper> requestList = new List<DateChangeWrapper>();

そして、DateChangeWrapperクラスは次のようになります

public class DateChangeWrapper : INotifyPropertyChanged
{
    public DateChangeWrapper(ResponseWrapper responseWrapper)
    {
        RequestId = responseWrapper.RequestId;
        ParentRequestId = responseWrapper.ParentRequestId;
        StartDate = responseWrapper.StartDate;
        EndDate = responseWrapper.EndDate;
    }

    private DateTime startDate;
    private DateTime endDate;

    public int RequestId { get; private set; }
    public int ParentRequestId { get; private set; }

    public DateTime StartDate
    {
        get { return startDate; }
        set
        {
            startDate = value;
            OnPropertyChanged("StartDate");
        }
    }

    public DateTime EndDate
    {
        get { return endDate; }
        set
        {
            endDate = value;
            OnPropertyChanged("EndDate");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;  

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

コードからわかるように、DatePickersとして表示されるStartDateとEndDateの2つの列があります。window.ShowDialogが呼び出されるコードをデバッグすると、Datesのgetアクセサーが呼び出されるのがわかります。しかし、日付ピッカーの値を変更しても、セッターは呼び出されず、リストには古い値が残っています。

私を助けてください

4

1 に答える 1

0

問題は、UpdateSourceTrigger が原因で、変更された値が基になるソースに更新されていないことでした。デフォルトでは、これには LostFocus の値があります。PropertyChanged に変更したところ、うまくいきました。:)

次のコード行をバインディングに追加しました

startDateBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

同様に EndDate についても

于 2013-01-13T12:12:55.317 に答える