背景:前段时间我在工作中创建了一个简单的VB.NET WinForms应用程序,它由一个表单和一个模块组成。该应用程序只是读取并更新Oracle数据库。
最近有人问我是否可以在创建应用程序时学习C#WPF和MVVM。我认为这个应用程序非常简单,可以尝试转换,这样我就可以从中学到更多具有挑战性的项目。而且我必须承认我正处于一个非常困难的时期。我想如果我能在应用程序的至少一部分(连接/读取/验证数据库上的员工ID)中正确设置MVVM部分,那么这种体验将使我能够自己完成其余部分。我对C#没有多少经验,我不知道我是否在这里修改了模型和ViewModel,或者是否需要反转它们。
目标:我想在此处执行的操作是在文本框中键入员工ID,然后单击按钮。如果员工ID存在,请执行某些操作。如果没有,则显示一个消息框。
我首先在IDE中创建了三个文件夹:Model
,View
和ViewModel
。然后,我创建了Model.cs
,MainWindow.xaml
和ViewModel.cs
。
我已经取得了足够的进展,使公共课Verify
发挥作用。但是,我不知道我是否完全正确地完成了它,显然我想要的行为并没有发生。
Model.cs
namespace Wpf_BrazeKiosk.Model
{
public class Model
{
}
public class Verify
{
public const string ConnectionStringToORACLE = "Provider=OraOLEDB.Oracle.1;Data Source=MPCS;User ID=secret;Password=secret;";
public OleDbDataReader rowread;
public OleDbDataReader Emp_verify(string emp)
{
var conn = new OleDbConnection(ConnectionStringToORACLE);
conn.Open();
string query = "select employee_id from mpcs.employee where employee_id = ?";
var cmd = new OleDbCommand(query, conn);
cmd.Parameters.AddWithValue("employee_id", emp);
rowread = cmd.ExecuteReader();
return rowread;
}
}
}
ViewModel.cs
namespace Wpf_BrazeKiosk.ViewModel
{
public class ViewModel
{
private string _EmpID;
public string EmpID
{
get
{
return _EmpID;
}
set
{
if (_EmpID == value)
{
return;
}
_EmpID = value;
}
}
}
}
MainWindow.xaml
<Window x:Class="Wpf_BrazeKiosk.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:local="clr-namespace:Wpf_BrazeKiosk"
mc:Ignorable="d"
Title="MainWindow" Height="837" Width="1000">
<Grid>
<TextBox x:Name="textBox2" Height="23" Margin="444,423,416,0" TextWrapping="Wrap" Text="TextBox" Width="120" VerticalAlignment="Top" HorizontalAlignment="Center"/>
<Button x:Name="button" Content="Remove" Margin="369,612,351,0" Width="260" Height="124" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Center"/>
</Grid>
</Window>
答案 0 :(得分:0)
您应该向视图模型添加--keepdb
属性。有关命令及其用途的更多信息,请参阅以下博客文章:http://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/。如果您搜索MVVM,可以在线获得更多有关MVVM和命令的信息。
完成此操作后,只需将ICommand
的{{1}}属性绑定到视图模型的Command
属性和{{1}的Button
属性即可。你的ICommand
财产:
Text
...并在命令的TextBox
方法中实现您的逻辑,例如:
EmpID
不要忘记将视图的<TextBox x:Name="textBox2" Text="{Binding EmpID}"/>
<Button x:Name="button" Content="Remove" Command="{Binding YourCommand}"/>
设置为Execute
类的实例:
public class ViewModel
{
public ViewModel()
{
YourCommandProperty = new DelegateCommand(Check);
}
private string _EmpID;
public string EmpID
{
get
{
return _EmpID;
}
set
{
if (_EmpID == value)
{
return;
}
_EmpID = value;
}
}
public ICommand YourCommandProperty { get; }
private void Check(object o)
{
//look up EmpId here...
MessageBox.Show("...");
}
}