将简单的WinForms应用程序转换为WPF,特别是MVVM

时间:2017-08-18 10:34:54

标签: c# sql wpf oracle mvvm

背景:前段时间我在工作中创建了一个简单的VB.NET WinForms应用程序,它由一个表单和一个模块组成。该应用程序只是读取并更新Oracle数据库。

最近有人问我是否可以在创建应用程序时学习C#WPF和MVVM。我认为这个应用程序非常简单,可以尝试转换,这样我就可以从中学到更多具有挑战性的项目。而且我必须承认我正处于一个非常困难的时期。我想如果我能在应用程序的至少一部分(连接/读取/验证数据库上的员工ID)中正确设置MVVM部分,那么这种体验将使我能够自己完成其余部分。我对C#没有多少经验,我不知道我是否在这里修改了模型和ViewModel,或者是否需要反转它们。

目标:我想在此处执行的操作是在文本框中键入员工ID,然后单击按钮。如果员工ID存在,请执行某些操作。如果没有,则显示一个消息框。

我首先在IDE中创建了三个文件夹:ModelViewViewModel。然后,我创建了Model.csMainWindow.xamlViewModel.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>

1 个答案:

答案 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("...");
    }
}