Nano Hash - криптовалюты, майнинг, программирование

Исключение нулевого значения для свойства, которое не является нулевым

Получение исключения NullValueException для свойства, не имеющего значения NULL

Вот код для начала ViewModel и метод, который создает объект ViewModel и открывает окно, в котором я использую ViewModelt. Исключение выбрасывается в свойстве SwitchName. _Ciscoswitch.SwitchName становится нулевым, потому что _ciscoswitch в SwitchVewModel имеет значение NULL. Исключение создается в InitializeComponent () в конструкторе SwitchBrowser. Если посмотреть на экземпляр SwitchVewModel в отладчике, _ciscoswitch не равно нулю. Я попытался изменить аксессуар SwitchName на использование CiscoSwitch.switchName вместо _ciscoswitch.SwitchName, но это все равно не удалось.

class SwitchViewModel : INotifyPropertyChanged
{
      #region Construction
    /// Constructs the default instance of a SwitchViewModel
    public SwitchViewModel()
    {

    }


    public SwitchViewModel(CiscoSwitch cs)
    {
       _ciscoswitch = cs;
    }
      #endregion
    #region Members

    CiscoSwitch _ciscoswitch;
    #endregion

    #region Properties
    public CiscoSwitch CiscoSwitch
    {
        get
        {
            return _ciscoswitch;
        }
        set
        {
            _ciscoswitch = value;
        }
    }

    public string SwitchName
    {
        get { return _ciscoswitch.switchName; }
        set
        {
            if (_ciscoswitch.switchName != value)
            {
               _ciscoswitch.switchName = value;
                RaisePropertyChanged("switchName");
            }
        }
    }
    #endregion

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Methods

    private void RaisePropertyChanged(string propertyName)
    {
        // take a copy to prevent thread issues
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

}
}

XAML для SwitchBrowserWindow единственное свойство, которое я использую прямо сейчас, - это SwitchName, чтобы попытаться заставить это работать.

<Window x:Class="CiscoDecodeWPF.SwitchBrowser"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CiscoDecodeWPF="clr-namespace:CiscoDecodeWPF" IsEnabled="{Binding Enabled}"
    Title="SwitchBrowser" Height="500" Width="500" Background="GhostWhite">

<Window.Resources>
    <Style TargetType="{x:Type TreeViewItem}" x:Key="ModuleStyle">
        <Setter Property="Foreground" Value="Blue"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>

    <Style TargetType="{x:Type TreeViewItem}" x:Key="RedModuleStyle" BasedOn="{StaticResource ModuleStyle}">
        <Setter Property="Foreground" Value="Red"/>
    </Style>
</Window.Resources>

<Window.DataContext>
    <CiscoDecodeWPF:SwitchViewModel/>
</Window.DataContext>
<Grid Margin="0,0,-211.4,-168">
    <StackPanel HorizontalAlignment="Stretch" Name="StackPanel1" VerticalAlignment="Stretch" Width="Auto" Margin="0,0,188.6,114">

        <StackPanel.Resources> 
            <Style TargetType="{x:Type Label}" x:Key="LabelStyle">
                <Setter Property="Foreground" Value="Blue"/>
                <Setter Property="FontSize" Value="12"/>
                <Setter Property="FontWeight" Value="Bold"/>
            </Style>
        </StackPanel.Resources>
        <Label Content="Switch Name:" Name="Label1" Height="25" HorizontalAlignment="Left"/>
        <Label Content="Software Version:" Name="Label2" HorizontalAlignment="Left" />
        <Label Content="Model Number:" Name="Label3" HorizontalAlignment="left"/>
        <Label Content="IP Address:" Name="Label4" HorizontalAlignment="left"></Label>
        <Label Content="Serial Number:" Name="Label5" HorizontalAlignment="Left"></Label>
        <Label Content="Show Tech Taken:" Name="Label6" HorizontalAlignment="left"/>
    </StackPanel>
    <StackPanel Margin="105,0,218,489">
        <StackPanel.Resources>
            <Style TargetType="{x:Type Label}" x:Key="LabelStyle">
                <Setter Property="FontSize" Value="12"/>
                <Setter Property="FontWeight" Value="Bold"/>
            </Style>
        </StackPanel.Resources>
        <Label Content="{Binding Path=SwitchName}" Name="SwitchNameLabel" HorizontalAlignment="left"/>
        <Label Content="Version" Name="VersionLabel" HorizontalAlignment="left"/>
        <Label Content="Model" Name="ModelNumberLabel" HorizontalAlignment="Left"/>
        <Label Content="IP" Name="IPAddressLabel" HorizontalAlignment="Left"/>
        <Label Content="Serial" Name="SerialLabel" HorizontalAlignment="Left"/>
            <Label Content="ST" Name="ShowTechLabel" HorizontalAlignment="Left"/>

    </StackPanel>

Исключение, трассировка стека и стек вызовов

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
 Message=Object reference not set to an instance of an object.
  Source=CiscoDecodeWPF
StackTrace:
   at CiscoDecodeWPF.SwitchViewModel.get_SwitchName() in 

d:\Projects\CiscoDecodeWPF\CiscoDecodeWPF\SwitchViewModel.cs:line 50

InnerException:

CiscoDecodeWPF.exe! CiscoDecodeWPF.SwitchViewModel.SwitchName.get () Строка 50 + 0xf байт C # [Внешний код] CiscoDecodeWPF.exe! CiscoDecodeWPF.SwitchBrowser.SwitchBrowser (CiscoDecodeWPF.CiscoSwitch cs! MainWindow.BrowseSwitchMenuItem_Click (отправитель объекта, System.Windows.RoutedEventArgs e) Строка 1050 + 0x34 байта C # [Внешний код]

05.10.2012

  • В вашем XAML почти наверняка что-то не так. Пожалуйста, опубликуйте это (и удалите часть C #) 05.10.2012
  • Кроме того, опубликуйте всю трассировку стека. 05.10.2012
  • С FirstOrDefault в new SwitchBrowser(cs.FirstOrDefault()) вы можете легко передать null как _4 _..., и если ваш код использует конструктор public SwitchViewModel() по умолчанию, _ciscoswitch также будет _7 _... 05.10.2012
  • @ChrisF, опубликовал XAML для SwitchBrowserWindow или, по крайней мере, до того бита, который использует SwitchName 05.10.2012
  • @Kirk, отправил Exeption и что отладчик дает для трассировки стека 05.10.2012
  • Мне интересно, использует ли Initialize () в SwitchBrowserWindow конструктор по умолчанию для ViewModel - это объяснило бы это 05.10.2012

Ответы:


1

Попробуйте ввести код в SwitchName:

 public string SwitchName
{
    get {
         if (_ciscoswitch != null)
         {   
           return _ciscoswitch.switchName;
         }
         else
         {
            return string.empty;
         }
      }
    set
    {
      if (_ciscoswitch != null)
      {
        if (_ciscoswitch.switchName != value)
        {
           _ciscoswitch.switchName = value;
            RaisePropertyChanged("switchName");
        }
      }
    }
}

Если вы не хотите проверять _ciscoswitch != null в SwitchName, тогда поместите DataContext = svm перед InitizlizeComponent ()

КОД:

public SwitchBrowser(CiscoSwitch cs)
{
    SwitchViewModel svm = new SwitchViewModel(cs);
    DataContext = svm;
    InitializeComponent();
 }

И удалите приведенный ниже код из XAML.

<Window.DataContext>
<CiscoDecodeWPF:SwitchViewModel/>
</Window.DataContext>

Надеюсь, это сработает.

05.10.2012
  • спасибо Jignesh, _ciscoswitch не должен быть нулевым. У меня есть экземпляр объекта CiscoSwitch, который я пытаюсь передать в качестве модели. 05.10.2012
  • @DavidGreen ‹Label Content = {Binding Path = SwitchName} Name = SwitchNameLabel HorizontalAlignment = left /› эта строка пытается получить Switchname из модели просмотра, но в это время _ciscoswitch имеет значение null. 05.10.2012
  • С параметром CiscoSwitch New () ViewModel вы создаете его в кодовой части, и вы назначаете значение DataContext после Initialization (). Но во время разработки вы только что создали новый объект Viewmodel со значением по умолчанию New (). Просто попробуйте с моим ответом. 05.10.2012
  • это сработало. проблема в том, что есть несколько свойств, и, видимо, мне придется их все протестировать. Я бы предпочел найти способ, чтобы XAML вызывал конструктор, который принимает параметр, если есть способ. Я пока не могу найти ни одного. 05.10.2012
  • @DavidGreen см. Мой обновленный ответ, прежде чем InitializeComponent () присвоит значение DataContext. 05.10.2012
  • это тоже не сработало. объект SwitchView Initialize () вызывал конструктор по умолчанию для SwitchViewModel. Я добавил строку в конструктор по умолчанию на SwitchViewModel, чтобы создать новый переключатель. Это позволяет завершить инициализацию, а затем я устанавливаю DataContext на фактическую модель SwitchViewModel с данными в ней. 05.10.2012
  • позвольте нам продолжить это обсуждение в чате 05.10.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..