视图模型在命名空间中不存在



如果这是一个愚蠢的问题,或者甚至不属于我所问的问题,我很抱歉,但我是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>

这是我见过的最糟糕的"复制和粘贴"工作之一...... 我不知道从哪里开始。

要运行应用程序,您必须:

  1. 按如下所示更改命名空间 VM;

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

DPSCalculatorPrototype.ViewModel 不存在。

  1. 窗口的代码隐藏中不存在TextBox_TextChanged。您必须添加方法

    private void TextBox_TextChanged(Object sender, TextChangedEventArgs e( { 做你的事情 }

在 MainWindow 类中。

为了避免给您或正在阅读您的代码的人带来麻烦,您 应该

  1. 每个类使用一个.cs文件。
  2. 避免将命名空间嵌套在同一.cs文件中,并创建复制命名空间结构的文件夹树。在您的代码段中,只需在根目录中创建一个UseOf_INotifyPropertyChanged文件夹,并在其中创建 MainWindowViewModel 类。
  3. 命名空间的用途必须清楚地读取代码。创建一个 DPS_Calculator_Prototype.ViewModels,并将所有应用程序视图模型放入其中。

我只是尝试使用不同的命名空间并使它们更简单。它有效。

DPS计算器原型.视图模型

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

DPS计算器原型

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)
{
}
}
}

您看到这些错误的原因是 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",并且此命名空间不存在,因此其中不存在任何内容。

最新更新