Viewmodel не существует в пространстве имен
Я извиняюсь, если это глупый вопрос или даже не подпадает под то, что я спрашиваю, но я новичок в 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-namespace: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 ответа
Это одна из худших работ по копированию и вставке, которую я когда-либо видел, парень... Я не знаю, с чего начать.
Просто для запуска приложения вы ДОЛЖНЫ:
изменить пространство имен VM следующим образом;
XMLNS: ВМ ="CLR-имена: DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged"
DPSCalculatorPrototype.ViewModel не существует.
TextBox_TextChanged не существует внутри кода позади окна. Вы должны добавить метод
private void TextBox_TextChanged(отправитель объекта, TextChangedEventArgs e) { // Делать ваши вещи}
в классе MainWindow.
Во избежание головной боли вам или тем, кто читает ваш код, СЛЕДУЕТ
- используйте один файл.cs для каждого класса.
- Старайтесь не вкладывать пространства имен в один и тот же файл.cs и создавать дерево папок, которое копирует структуру пространства имен. В своем фрагменте просто создайте папку UseOf_INotifyPropertyChanged в корне и создайте класс MainWindowViewModel внутри него.
- Назначение пространства имен должно быть четким при чтении кода. Создайте DPS_Calculator_Prototype.ViewModels и поместите в него всю модель приложения.
Причина, по которой вы видите эти ошибки, заключается в том, что 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>
Вы получали эти ошибки, потому что у вас был "ViewModel" в объявлении пространства имен, и это пространство имен не существует, и поэтому в нем ничего не существует.
Я просто попытался использовать разные пространства имен и сделать их более простыми. И это работает.
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)
{
}
}
}