Исключение Wpf instance builder exception: nullreferenceexception: ссылка на объект не установлена на экземпляр объекта
Привет Ребята,
У меня есть sln внутри .Сеть которая основана на 2 проектах:
- Приложение Wpf под названием "Installer" и библиотека классов под названием "InstallerCore".
- "InstallerCore" отвечает за доступ к базе данных, и в основном это уровень данных.
В приложении wpf каждый контекст данных пользовательского элемента управления загружается из модели представления, и модель представления использует "InstallerCore" для извлечения данных путем наследования своего базового класса.
Моя проблема-это конструктор экземпляров XAML. Как только я загружаю один из пользовательских элементов управления, я получаю исключение: "не удается создать экземпляр uc".
Так вот, это не совсем так. Если я просматриваю трассировку стека, то вижу, что внутреннее исключение скрывает более глубокую ошибку.:
"NullReferenceException: ссылка на объект не установлена на экземпляр объекта".
Позвольте мне показать вам, что происходит в коде:
Допустим, у меня есть класс с именем 'uc_file_system'.
В коде позади я загружаю его контекст данных из модели представления, подобной этой:
public partial class uc_file_system : UserControl { FileSystemViewModel vm; public uc_file_system() { InitializeComponent(); vm = new FileSystemViewModel(); this.DataContext = vm; } }
Модели представления конструктор выглядит так:
public class FileSystemViewModel : BaseDA, INotifyPropertyChanged { public FileSystemViewModel() : base(GV.InstallerConnectionString) { GetSomeDataFromDataBase(); } void GetSomeDataFromDataBase() { List<p> prms = new List</p><p>(); prms.Add(new P() { ParamName = "@description", ParamValue = "InstallationFolder" }); DataTable res = ExecuteReader(InstallerConsts.GetGlobalParams, prms); InstallationBaseFolder = res.Rows[0][0].ToString(); } }
На ГВ.InstallerConnectionString-это свойство, которое возвращает строку подключения из статического класса:
public static class GV // {Global Variables} { #region Members private static List<connectionstringinfo> connectionStrings; #endregion #region Properties public static string InstallerConnectionString { get { return ConnectionStringInfoHandler.GetConnectionString(ConnectionStrings, ConnectionStringType.Installer); } } public static List<connectionstringinfo> ConnectionStrings { get { return connectionStrings; } set { if (connectionStrings == null) { connectionStrings = value; } } } }
ConnectionStrings устанавливается в файле app.xaml.cs следующим образом:
protected override void OnStartup(StartupEventArgs e) { GV.ConnectionStrings = (List<connectionstringinfo>)ConfigurationManager.GetSection(ConnectionStringInfoHandler.SectionName); }
Класс BaseDa в рамках проекта "InstallerCore" выглядит следующим образом:
public class BaseDA { public BaseDA(string connectionString) { ConnectionString = connectionString; } }
А строка подключения поступает из файла app.config приложения wpf:
<configuration> <configsections> </p><section name="connectionStringInfos"> <connectionstringinfos> <connectionstringinfo name="Installer" type="Installer" connectionstring="Data Source=localhost\sqlexpress;Initial Catalog=InstallerDB;Integrated Security=True;" providername="System.Data.SqlClient"> <startup> <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.5">
Теперь очень важно упомянуть, что как только я заменю ' GV.InstallerConnectionString' непосредственно со строкой, которая на самом деле является строкой подключения (жестко закодированной), исключение в xaml исчезает.
Также важно отметить, что код работает без ошибок во время выполнения, несмотря ни на что, и мне удается получить данные из базы данных.
Это трассировка стека:
at InstallerCore.Configuration.ConnectionStringInfoHandler.GetConnectionString(List`1 lst, ConnectionStringType type) at Installer.Settings.GV.get_InstallerConnectionString() at Installer.ViewModels.FileSystemViewModel..ctor() at Installer.UserControls.uc_file_system..ctor()
Что я уже пробовал:
Почти все.................................