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上的属性来访问计数器。绑定非常好,因为它允许视图在属性更改时自动更新。但是,要使其正常工作,您需要实现viewmodelINotifyPropertyChanged
,这会通知WPF组件它们需要显示不同的值
下面是它的工作原理:
视图模型:
使用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"/>