2015-01-22 2 views
0

Я попытался передать объект в следующее окно, но я получаю исключение Null. Так что в моем первом окне:Пропускать объекты между окнами

 private void Button_Ok_Click(object sender, RoutedEventArgs e) 
     { 
      if (file == null) 
      { 
       System.Windows.MessageBox.Show("null"); 
       return; 
      } 
      MainWindow wnd = new MainWindow 
      { 
       myFileInfo = file 
      }; 
      if(wnd.myFileInfo == null) 
       System.Windows.MessageBox.Show("null2"); 
      wnd.Show(); 
     } 

MessegeBox не появляются так file и wnd.myFileInfo являются определенно не нулевой.

Второе окно:

public partial class MainWindow : Window 
    { 
     public FileInfo myFileInfo; 
     //... 
     public MainWindow() 
     { 
      InitializeComponent(); 
      LabelFileName.Content = "File Name: " + this.myFileInfo.Name.ToString(); // Null exception 
     //... 
     } 
    } 

Я сделал все возможное, чтобы найти решение, к сожалению, неудачная.

XAML:

<Grid> 
    <Label Name="LabelFileName" Grid.Column="0" Grid.Row="0" /> 
</Grid> 

Сообщение исключения: { "Ссылка на объект не указывает на экземпляр объекта."}

трассировки стека:

at Charts.MainWindow..ctor() in c:\Users\Daniel\Documents\Visual Studio 2012\Projects\Charts\Charts\MainWindow.xaml.cs:line 143 
    at Charts.Init.Button_Ok_Click(Object sender, RoutedEventArgs e) in c:\Users\Daniel\Documents\Visual Studio 2012\Projects\Charts\Charts\Init.xaml.cs:line 84 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) 
    at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
    at System.Windows.Controls.Button.OnClick() 
    at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) 
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
    at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) 
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
    at System.Windows.Input.InputManager.ProcessStagingArea() 
    at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
    at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
    at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
    at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 
    at System.Windows.Application.Run() 
    at Charts.App.Main() in c:\Users\Daniel\Documents\Visual Studio 2012\Projects\Charts\Charts\obj\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

Ok, я понял, почему это дает мне исключение. Я пытаюсь создать новое окно с параметром. Первый класс MainWindow пытается вызвать конструктор, после конструктора он будет устанавливать параметр в объект. До тех пор, пока im, использующий этот объект перед конструктором, сделает его очевидным, что он собирается дать мне исключение.

+2

Почему вы не используете модель представления? –

+0

Действительно ли мне нужна модель представления для передачи одного объекта? – Finchsize

+0

это поможет с тестированием. –

ответ

1

Вы считали, что рассматриваете систему обмена сообщениями? Такие, как те, которые включены в MVVMLight, Jounce или любое количество других инфраструктур MVVM? Тем не менее, нетрудно свернуть собственный агрегатор событий. У вас должен быть механизм для обоих окон, чтобы получить экземпляр агрегатора событий; либо через какой-то сервис-локатор, либо в инфраструктуру инъекций зависимостей, или даже создавая его как свойство из вашего основного класса приложения.

С отправкой сообщений вы по существу отправляете сообщение из своего первого окна, и ваше второе окно будет слушать его.

В вашем случае щелчок на кнопке отобразит окно, а затем опубликует сообщение. Второе окно после получения сообщения сможет воздействовать на его содержимое.

0

Если вы используете «ToString()» на имени, значит ли это, что тип «Имя» уже не является строкой? И если это так, то я думаю, вы должны дать ему значение или, по крайней мере, создать его экземпляр?

Линия 143, что это такое?

Eeesh. Поместите точку останова на эту строку, наведите указатель мыши на каждый объект и свойство и узнайте, что такое null. Меня это раздражает, и я хочу знать!

+1

Имя является свойством класса System.IO.FileInfo. И он имеет свою ценность перед тем, как перейти во второе окно. – Finchsize

+0

Строка 143: 'LabelFileName.Content =" Имя файла: "+ this.myFileInfo.Name.ToString();' ... – Finchsize

+0

Мне не нужна точка останова там, пока я получаю нулевое исключение, там программа там все равно остановится , Я знаю, что такое null, поскольку я упомянул его объект myFileInfo класса FileInfo, который я пытаюсь передать. – Finchsize

0

Не могли бы вы добавить вторичный конструктор для второго окна? Затем передайте объект конструктору.

public partial class MainWindow : Window 
    { 
     public FileInfo myFileInfo; 
     //... 
public MainWindow(FileInfo theInfo) 
{ 
InitializeComponent(); 
myFileInfo = theInfo; 
} 

     public MainWindow() 
     { 
      InitializeComponent(); 
      LabelFileName.Content = "File Name: " + this.myFileInfo.Name.ToString(); // Null exception 
     //... 
     } 
    } 

Затем при создании нового окна передайте объект информации о файле.

+0

Вторичный конструктор в WPF MainWindow :) Его самоубийство. В конструкторе окна намного больше, чем только этот объект. – Finchsize

+0

Да, я действительно не видел, где вы устанавливаете публичное свойство в классе, поэтому я предложил вторичный конструктор. Я предполагаю, что LabelContent имеет значение NULL. –

+0

Я могу сделать это несколькими способами, singleton class, ViewModel (как кто-то упомянул ранее) в любом случае, любопытно, почему это дает мне пустое исключение. – Finchsize