1

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

我收到错误消息“名称空间‘DPS_Calculator_Prototype.UseOf_INotifyPropertyChanged’中不存在类型或名称空间名称‘ViewModel’(您是否缺少程序集引用?)”和“名称空间‘clr’中不存在名称‘MainWindowViewModel’ -命名空间: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>
4

3 回答 3

1

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

DPSCalculatorPrototype.ViewModel

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

主窗口.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>

主窗口.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)
        {
        }
    }
}
于 2018-06-27T21:00:09.833 回答
1

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

于 2018-06-27T21:00:56.640 回答
1

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

只是为了运行你必须的应用程序:

  1. 按如下方式更改命名空间 VM;

    xmlns:VM="clr-命名空间: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 并将所有应用程序视图模型放入其中。
于 2018-06-27T22:05:53.097 回答