2015-10-07 2 views
0

Я не знаю, что не так с моим кодом и как я могу его решить.C# wpf - ссылка на объект не установлена ​​в экземпляр объекта

public class ExampleViewModel<T> : ViewModelBase where T : IAppointment 
{ 
    private Uri appointmentsSource; 
    private ObservableCollection<T> appointments; 

    public ICommand AppointmentCreatedCommand { get; set; } 

    public Uri AppointmentsSource 
    { 
     get { return this.appointmentsSource; } 
     set { this.appointmentsSource = value; } 
    } 

    public ExampleViewModel() 
    { 
     this.AppointmentCreatedCommand = new DelegateCommand(OnAppointmentCreatedCommandExecute); 
    } 

    private void OnAppointmentCreatedCommandExecute(object obj) 
    { 
     var createdAppointment = ((AppointmentCreatedEventArgs)(obj)).CreatedAppointment as Appointment; 
     ObservableAppointmentCollection apps = System.Windows.Markup.XamlReader.Load(File.OpenRead("../../Appointments.xaml")) as ObservableAppointmentCollection; 
     apps.Add(createdAppointment); 
     File.WriteAllText("../../Appointments.xaml", System.Windows.Markup.XamlWriter.Save(apps)); 
     string text = File.ReadAllText("../../Appointments.xaml"); 
     text = text.Replace("<Appointment.TimeZone><s:TimeZoneInfo /></Appointment.TimeZone>", " "); 
     File.WriteAllText("../../Appointments.xaml", text); 
    } 

    public ObservableCollection<T> Appointments 
    { 
     get 
     { 
      if (this.appointments == null) 
      { 
       this.appointments = new ObservableCollection<T>(LoadAppointmentsSource(this.AppointmentsSource)); 
      } 
      return this.appointments; 
     } 
    } 

    protected static IEnumerable<T> LoadAppointmentsSource(Uri appointmentsSource) 
    { 
     if (appointmentsSource != null) 
     { 
      IEnumerable<T> appointments = Application.LoadComponent(appointmentsSource) as IEnumerable<T>; 
      return appointments; 
     } 
     return Enumerable.Empty<T>(); 
    } 

    private static DateTime GetStart(T a) 
    { 
     return a.Start.Date; 
    } 
} 

XAML

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="AppointmentCreated"> 
     <i:InvokeCommandAction Command="{Binding AppointmentCreatedCommand, Mode=TwoWay}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

есть ошибка

NullReferenceException был необработанное кодом пользователя

объекта не задана ссылка на экземпляр объекта.

на

var createdAppointment = ((AppointmentCreatedEventArgs)(obj)).CreatedAppointment as Appointment;

каждый раз, когда я создать встречу в моем RadScheduleView (Telerik), он должен был создать назначение затем записать его в Appointments.xaml.

+0

проверить, является ли obj нулевым или какой тип, если он не равен нулю. –

+0

является объектом типа НазначениеСозданоEventArgs ?? – User2012384

+0

вы также должны опубликовать код вызывающего абонента OnAppointmentCreatedCommandExecute. Очевидно, что 'obj' является нулевым, но нам нужно выяснить, почему :) –

ответ

1

Видя ваш XAML и типы, которые вы используете в вашей команде, я думаю, что вы путаете Команды и События.

Команды - это способ выполнения метода на одно предопределенное действие, обычно нажатие кнопки (обычно щелчком, нажатием или нажатием клавиши), тогда как события - это способ для объекта реагировать на всевозможные условия , Обычно события выставляют много событий, тогда как в пользовательском элементе может быть только одна команда.

Теперь большая разница заключается в том, что отправитель заполняет и передает объект eventArgs, содержащий подробную информацию о характере ситуации, которая вызвала событие. Что касается команды, этого не происходит. Можно передать параметр методу, который будет обрабатывать выполнение команды при запуске, но вы должны сами выбрать этот объект. Способ, которым вы выбираете объект, который должен быть передан, - это привязка данных, очень похожая на сам объект Command, но с атрибутом CommandParameter вместо Command.

CommandParameter="{Binding ...}" 
+0

Я поставил там код XAML. btw есть ошибка '' DSSchedule.DelegateCommand 'не содержит конструктор, который принимает 1 аргументы – Mirza

+0

DelegateCommand принимает действие . убедитесь, что 'OnAppointmentCreatedCommandExecute' соответствует этому, изменив тип obj. (Я отредактировал ответ) –

+0

изменить тип на? Мне нужно изменить «объект obj»? – Mirza

0

В этой строке:

var createdAppointment = ((AppointmentCreatedEventArgs)(obj)).CreatedAppointment as Appointment;

Проверка на нулевое значение в OBJ и CreatedAppointment. Похоже, что любой из них не имеет своих значений.

Смежные вопросы