равенство на отправителя события - PullRequest
0 голосов
/ 06 июня 2009

У меня есть интерфейс для виджета пользовательского интерфейса, два из которых являются атрибутами докладчика.

public IMatrixWidget NonProjectActivityMatrix {
        set {
            // validate the incoming value and set the field
            _nonProjectActivityMatrix = value;
            ....
            // configure & load non-project activities
     }

public IMatrixWidget ProjectActivityMatrix {
        set {
            // validate the incoming value and set the field
            _projectActivityMatrix = value;
            ....
            // configure & load project activities
   }

У виджета есть событие, на которое подписываются оба объекта презентатора, и поэтому в презентаторе есть обработчик события, например:

public void OnActivityEntry(object sender, EntryChangedEventArgs e) {
    // calculate newTotal here
    ....
        if (ReferenceEquals(sender, _nonProjectActivityMatrix)) {
            _nonProjectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal);
        }

        else if (ReferenceEquals(sender, _projectActivityMatrix)) {
            _projectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal);
        }
        else {
            // ERROR - we should never be here
        }
    }

Проблема в том, что ReferenceEquals на отправителе завершается ошибкой, хотя отправителем является реализованный виджет - тот же реализованный виджет, который был установлен для атрибута Presenter!

Может кто-нибудь определить, в чем проблема / исправить?

Cheers, Berryl

Я не знал, что вы могли бы редактировать красиво. Здорово. Вот код мероприятия:

void OnGridViewNumericUpDownEditingControl_ValueChanged(object sender, EventArgs e)
    {
    // omitted to save sapce

        if (EntryChanged == null) return;

        var args = new EntryChangedEventArgs(activityID, dayID, Convert.ToDouble(amount));
        EntryChanged(this, args);
    }

Вот дамп отладчика атрибута Presenter, информация о пространстве имен sans:

?_nonProjectActivityMatrix
{WinPresentation.Widgets.MatrixWidgetDgv}
[WinPresentation.Widgets.MatrixWidgetDgv]: {WinPresentation.Widgets.MatrixWidgetDgv}

Вот дамп отладчика отправителя:

?sender
{WinPresentation.Widgets.MatrixWidgetDgv}
base {Core.GUI.Widgets.Lookup.MatrixWidgetBase<Core.GUI.Widgets.Lookup.DynamicDisplayDto>}: {WinPresentation.Widgets.MatrixWidgetDgv}
_configuration: {Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration}
_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget}
AllowUserToAddRows: true
ColumnCount: 11
Count: 4
EntryChanged: {Method = {Void OnActivityEntry(System.Object, Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.EntryChangedEventArgs)}}
SelectedCell: {DataGridViewNumericUpDownCell { ColumnIndex=3, RowIndex=3 }}
SelectedCellValue: "0.00"
SelectedColumn: {DataGridViewNumericUpDownColumn { Name=MONDAY, Index=3 }}
SelectedItem: {'AdministrativeActivity: 130-04', , AdministrativeTime, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}
  • Berryl

1 Ответ

0 голосов
/ 06 июня 2009

Вне головы я могу подумать о следующих причинах, по которым ReferenceEquals вернет false:

  • sender is null - Убедитесь, что виджет отправляет this в качестве параметра отправителя при возникновении события.
  • Виджет не назначен докладчику по какой-то причине, поэтому он null
  • sender это не то, что вы думаете (как вы убедились, что это действительно отправитель, которого вы ожидаете)
  • Виджет реализован как struct, а не class

Может быть и больше, но это то, с чего я бы начал (в таком порядке).

Обновление : одна вещь, которая бросается в глаза, это:

_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget}

Может быть, отправитель является объектом, который оборачивает ваш виджет? Если это так, то ReferenceEquals будет естественно возвращать false при выполнении сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...