C# 如何在wpf中将一个窗口中的计数转换为另一个窗口中的计数

C# 如何在wpf中将一个窗口中的计数转换为另一个窗口中的计数,c#,wpf,C#,Wpf,在我的代码中,我得到了第二个窗口中的点击次数,并在第一个窗口(主窗口)中显示它。我如何才能做到这一点。我在下面尝试的方法不起作用 C# code in second window public partial class Window1 : Window { int counter = 0; private void Button_Click(object sender, RoutedEventArgs e) {

在我的代码中,我得到了第二个窗口中的点击次数,并在第一个窗口(主窗口)中显示它。我如何才能做到这一点。我在下面尝试的方法不起作用

    C# code in second window

 public partial class Window1 : Window
    {
        int counter = 0;

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            counter++;
            hope.Text = counter.ToString();
        }
    }
主窗口中的Xaml代码
您的代码不起作用,因为文本框
hope
被定义为主类中的字段,您试图在第二个类中引用它,而没有指定第一个类的实例。有几种方法可以解决这个问题(您可以将对
hope
的引用公开为公共静态变量),但您肯定应该研究如何实现MVVM。我建议你查阅一个详细的教程,这样你就可以得到完整的故事,但我会尝试在这里解释基本知识

在遵循MVVM(模型-视图-视图-模型)时,您可以将代码划分为几个独立的角色。XAML和任何相关的代码隐藏都被视为视图角色的一部分。问题中的代码示例也是视图的一部分。通常,您不希望视图实现严格必需的逻辑之外的任何逻辑,或者直接与UI相关的逻辑。这条规则也有例外,但一般来说你应该遵守

视图模型的工作是促进模型(数据)和视图之间的通信。例如,您可以将计数器变量放入数据库中,或者将其打包到可序列化的类中,然后从文件中加载它。viewmodel将通过公共属性访问您选择的任何模型,其set和get函数将确保正确访问数据

最后,视图可以通过绑定到viewmodel上的属性来访问计数器。绑定非常好,因为它允许视图在属性更改时自动更新。但是,要使其正常工作,您需要实现viewmodel
INotifyPropertyChanged
,这会通知WPF组件它们需要显示不同的值

下面是它的工作原理:

  • viewmodel上的值已更改
  • 已修改的属性引发PropertyChanged事件
  • 绑定到属性的任何组件都将处理事件并更新其值
  • 最后,要从视图中更改viewmodel的属性,可以使用命令。命令在viewmodel上实现,可以从视图中执行。在许多情况下,可以使用命令代替事件

    我编写了一个简单的计数器程序,演示了一些核心MVVM原则。它所做的只是在单击按钮时增加一个数字,类似于示例代码。它在一个窗口中,但您可以轻松地修改它以使用两个不同的窗口。我建议你试着把它作为一种锻炼,这样你就可以感受到每件事是如何运作的

    如果您使用的是Visual Studio,您可以将所有这些内容复制粘贴到名为“ExampleProject”的WPF项目中并运行它;我对它进行了测试,结果正如预期的那样

    XAML:

    
    
    视图模型:

    使用System.ComponentModel;
    使用System.Windows.Input;
    使用ExampleProject.Commands;
    使用ExampleProject.Model;
    命名空间ExampleProject.ViewModel
    {
    //这是viewmodel。请注意,它实现了INotifyPropertyChanged。
    //您几乎总是希望viewmodel这样做。
    公共类CounterViewModel:INotifyPropertyChanged
    {
    //无论何时更改控件所包含的属性,都要调用此函数
    //可能是绑定到
    公共事件属性更改事件处理程序属性更改;
    //这是基础数据。包括对中模型的引用
    //viewmodel是一种方便用户之间通信的方法
    //第二,尽管还有其他方法。
    私人反模式;
    //这是最重要的部分;您的观点将与此相关联。
    公共整数计数器
    {
    获取{return model.Counter;}
    设置
    {
    模型计数器=值;
    调用(这是新的PropertyChangedEventArgs(“计数器”);
    }
    }
    //这是一个将递增计数器并可调用的函数
    //直接从XAML。
    公共ICommand增量{get;}
    //在我们的例子中,这个构造函数需要是无参数的,因为
    //我们将从XAML创建这个类的一个实例。
    公共反视图模型()
    {
    模型=新的反模型(0);
    增量=新的增量命令();
    }
    }
    }
    
    型号:

    名称空间ExampleProject.Model
    {
    //这是一个简单的模型类
    //在这里实现任何逻辑;在纯MVVM中,模型只是
    //封装原始数据。
    公共类反模型
    {
    公共int计数器;
    公共计数器模型(int计数器值)
    {
    计数器=计数器值;
    }
    }
    }
    
    增量命令:

    使用系统;
    使用System.Windows.Input;
    使用ExampleProject.ViewModel;
    命名空间ExampleProject.Commands
    {
    公共类递增命令:ICommand
    {
    //由于ICommand的原因,必须实现,但我们目前没有使用此功能
    公共事件处理程序CanExecuteChanged;
    公共布尔CanExecute(对象参数)
    {
    //如果此方法返回false,则不会执行该命令。
    返回true;
    }
    public void Execute(对象参数)
    {
    //参数通过XAML传入;它始终是CounterViewModel的实例
    //但我仔细检查了它到底是什么东西。
    if(参数为CounterViewModel viewModel)
    {
    viewModel.Counter++;
    }
    }
    }
    }
    
    注意,我不需要在代码中添加任何内容
        Xaml code in Main window
      <TextBlock x:Name="hope" HorizontalAlignment="Left" TextWrapping="Wrap"   FontWeight="Bold" Text="Attendees" VerticalAlignment="Top" Height="23" Width="157"/>