Viewmodel не существует в пространстве имен - PullRequest
0 голосов
/ 27 июня 2018

Извините, если это глупый вопрос или даже не подпадает под то, что я спрашиваю, но я новичок в WPF и, похоже, не могу понять его. Сейчас я делаю что-то похожее на https://www.c -sharpcorner.com / article / use-inotifypropertychanged-interface-in-wpf-mvvm / и столкнулся с проблемой. Когда я пытаюсь выполнить свой код:

namespace DPS_Calculator_Prototype
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow() {
            InitializeComponent();
            }
    }
    public class NotifyPropertyChanged : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChange(string propertyName) {
            PropertyChanged?.Invoke(this, new 
PropertyChangedEventArgs(propertyName));
        }
    }


        public class Calculator: NotifyPropertyChanged
        {
            private string _damage;
            public string Damage {
                get { return _damage; }
                set {
                    _damage = value;
                    RaisePropertyChange("Damage");
                }
            }
        }

    namespace UseOf_INotifyPropertyChanged
    {
        public class MainWindowViewModel : Calculator
        {
            public MainWindowViewModel() {
                Damage = "7";
            }
        }
    }
}

Я получаю сообщение об ошибке «Тип или имя пространства имен« ViewModel »не существует в пространстве имен« DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged »(вам не хватает ссылки на сборку?)» а также "Имя" MainWindowViewModel "не существует в пространстве имен" пространство имен clr: DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged.ViewModel '. " а также «Тип« VM: MainWindowViewModel »не был найден. Убедитесь, что вы не пропустили ссылку на сборку и что все ссылочные сборки были построены». Я получаю первую ошибку дважды, один раз в MainWindow.g.cs и еще один в MainWindow.xaml. Два других находятся в MainWindow.XAML Если кто-нибудь может сказать мне, что я делаю неправильно, это было бы здорово. Вот файл XAML:

<Window x:Class="DPS_Calculator_Prototype.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:VM="clr-namespace:DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged.ViewModel"
    xmlns:local="clr-namespace:DPS_Calculator_Prototype"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <VM:MainWindowViewModel x:Name="VMMainWindow">
        </VM:MainWindowViewModel>
    </Window.DataContext>

    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" 
         Text="{Binding Damage}" VerticalAlignment="Top" Width="120" 
         Margin="78,28,0,0" TextChanged="TextBox_TextChanged"/>
    </Grid>
</Window>

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Причина, по которой вы видите эти ошибки, заключается в том, что WPF ищет в упомянутых пространствах имен и не может найти то, что вы ищете. Если вы посмотрите на свой код XAML, вы увидите строку, которая говорит:

xmlns:VM="clr-namespace:DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged.ViewModel" 

Это то, что объявляет об использовании пространства имен, поэтому нам нужно указать его в правильной области. Измените свой XAML, чтобы он выглядел следующим образом:

<Window x:Class="DPS_Calculator_Prototype.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:VM="clr-namespace:DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged"
        xmlns:local="clr-namespace:DPS_Calculator_Prototype"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"> 

 <Window.DataContext>
    <VM:MainWindowViewModel x:Name="VMMainWindow">  
    </VM:MainWindowViewModel>
 </Window.DataContext> 

  <Grid>
    <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text=" 
    {Binding Damage}" VerticalAlignment="Top" Width="120" Margin="78,28,0,0" 
    TextChanged="TextBox_TextChanged"/>
  </Grid>
</Window>

Вы получали эти ошибки, потому что у вас был "ViewModel" в объявлении пространства имен, и это пространство имен не существует, и поэтому в нем ничего не существует.

0 голосов
/ 28 июня 2018

Это одна из худших работ по копированию и вставке, которую я когда-либо видел, парень ... Я не знаю с чего начать.

Просто для запуска приложения вы ДОЛЖНЫ:

  1. изменить пространство имен VM следующим образом;

    XMLNS: VM = "CLR-пространств имен: DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged"

DPSCalculatorPrototype.ViewModel не существует.

  1. TextBox_TextChanged не существует внутри кода позади окна. Вы должны добавить метод

    private void TextBox_TextChanged (отправитель объекта, TextChangedEventArgs e) { // Делай свои вещи }

в классе MainWindow.

Во избежание головной боли вам или тем, кто читает ваш код, вы СЛЕДУЕТ

  1. использовать один файл .cs для каждого класса.
  2. Избегайте вложения пространств имен в один и тот же файл .cs и создавайте дерево папок, которое копирует структуру пространства имен. В своем фрагменте просто создайте папку UseOf_INotifyPropertyChanged в корневом каталоге и создайте класс MainWindowViewModel внутри него.
  3. Назначение пространства имен должно быть четким при чтении кода. Создайте DPS_Calculator_Prototype.ViewModels и поместите в него всю модель приложения.
0 голосов
/ 28 июня 2018

Я только что попробовал использовать разные пространства имен и сделать их более простыми. И это работает.

DPSCalculatorPrototype.ViewModel

namespace DPSCalculatorPrototype.ViewModel
{
    public class MainWindowViewModel : Calculator
    {
        public MainWindowViewModel()
        {
            Damage = "7";
        }
    }
}

DPSCalculatorPrototype

namespace DPSCalculatorPrototype
{
    public class Calculator : NotifyPropertyChanged
    {
        private string _damage;

        public string Damage
        {
            get { return _damage; }

            set
            {
                _damage = value;
                RaisePropertyChange("Damage");
            }
        }
    }

    public class NotifyPropertyChanged : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChange(string propertyName)
        {
            PropertyChanged?.Invoke(this, new
            PropertyChangedEventArgs(propertyName));
        }
    }
}

MainWindow.xaml

<Window x:Class="DPSCalculatorPrototype.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:VM="clr-namespace:DPSCalculatorPrototype.ViewModel"
            xmlns:local="clr-namespace:DPSCalculatorPrototype"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <VM:MainWindowViewModel x:Name="VMMainWindow"></VM:MainWindowViewModel>
    </Window.DataContext>
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="{Binding Damage}" VerticalAlignment="Top" Width="120" Margin="78,28,0,0" TextChanged="TextBox_TextChanged" />
    </Grid>
</Window>

MainWindow.xaml.cs

namespace DPSCalculatorPrototype
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
        }
    }
}
...