如何将文本框绑定到类Property

汉克

我想将类中的属性单向绑定到文本框。但遇到麻烦时,scenario在下面的代码中,将test_string的字符串值放入我的视图中。我尝试过此代码,但似乎不起作用。我需要做什么?

具有属性的类:

namespace config
{
    class tester : INotifyPropertyChanged
    {
        public tester()
        {
        }

        private string test_string;

        public string Test{
            get { return test_string; }
            private set
            {
                test_string = value;
                RaisePropertyChanged("Test");
            }
        }

        public void dotest(){
            ... do some testing
            Test = "Past point one"
            ... do some more testing
            Test += "Past point two"
            ... do some more testing
            Test += "Finished testing"
        }
    }
}

视图模型

using config
namespace notif
{
    class t_viewmodel
    {
        public t_viewmodel()
        {
        }

        Tester tester = new Tester();

        public string TestLink
        {
            get { return tester.Test; }
        }

        public void run_test()
        {
            tester.dotest();
        }
    }
}

视图

<Window x:Class="notif.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="263" Width="539"
        xmlns:viewmodel="clr-namespace:notif" >

    <Window.DataContext>
        <viewmodel:t_viewmodel/>
    </Window.DataContext>

    <Grid>
        <TextBox Name="txtTestMessage" Text="{Binding TestLink}" />
        <Button Content="Do Test" Name="button1" />
        <!--Pretending the button it goes to viewmodels run_test()-->
    </Grid>
</Window> 


[EDIT1]由于该过程正在通过dotest运行,因此直到文本框填充完毕后,我才能做些什么使每次设置Test属性时都进行此更新吗?


[EDIT2]已更改

public void SQLDBAccessTest(string db)
{
    if (test_debug)
        ConnectionTest = "Test started. " + DateTime.Now;

    string conn_string = "";

    try
    {
        conn_string = createConnectionString(db);
        if (test_debug)
            ConnectionTest += "\nConnection string = '" + conn_string + "'";
    }
    catch (Exception ex)
    {
        throw ex;
    }

    try
    {
        if (test_debug)
            ConnectionTest += "\nCreating connection to database...";

        cnn = new SqlConnection(conn_string);

        if (test_debug)
            ConnectionTest += "\nConnection created.";

        if (test_debug)
            ConnectionTest += "\nEstablishing open connection to database...";

        cnn.Open();

        if (test_debug)
            ConnectionTest += "\nEstablished connection to database.";
        if (test_debug)
            ConnectionTest += "\nClosing connection to database...";

        cnn.Close();

        if (test_debug)
            ConnectionTest += "\nConnection closed.";
    }
    catch (Exception ex)
    {
        if (test_debug)
            ConnectionTest += "\nAn error has occured whilst connecting to the database.\n\t - " + ex.Message;

        throw ex;
    }

    if (test_debug)
        ConnectionTest += "\nTest complete. " + DateTime.Now;
}

private string createConnectionString(string db)
{
    string tempConString = ConStr;

    try
    {
        TestConnSettingsFile();
        setDBDataSourceAndSecurity();

        if (test_debug)
            ConnectionTest += "\nCreating connection string...";

        tempConString = tempConString.Replace("<SERVER>", db_datasource);
        tempConString = tempConString.Replace("<DB>", db);
        tempConString = tempConString.Replace("<SECURITY>", db_security);

        if (test_debug)
            ConnectionTest += "\nCreated connection string.";
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return tempConString;
}

private bool TestConnSettingsFile()
{
    bool settingsFileExist = false;
    string filePath = "";

    if (test_debug)
        ConnectionTest += "\nTesting for encrypted connection file...";

    try
    {
        string directory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
        filePath = System.IO.Path.Combine(directory, "afx.settings");

        if (System.IO.File.Exists(filePath))
        {
            settingsFileExist = true;
            xmlSettingsFilePath = filePath;

            if (test_debug)
                ConnectionTest += "\nThe encrypted connection file has been found at: " + filePath;
        }
        else
        {
            if (test_debug)
                ConnectionTest += "\nThe encrypted connection file could not be found at: " + filePath;
            throw new Exception("The encrypted connection file could not be found at: " + filePath);
        }
    }
    catch (Exception ex)
    {
        if (test_debug)
            ConnectionTest += "\nError occured while testing if encrypted file exists:\n\t - " + ex.Message;
        throw ex;
    }

    return settingsFileExist;
}

private bool setDBDataSourceAndSecurity()
{
    bool result = false;

    if (test_debug)
        ConnectionTest += "\nRetrieving encrypted connection...";

    try
    {
        if (System.IO.File.Exists(xmlSettingsFilePath))
        {
            XmlTextReader reader = null;

            if (test_debug)
                ConnectionTest += "\nReading connection xml file...";

            // Load the file with an XmlTextReader
            reader = new XmlTextReader(xmlSettingsFilePath);
            // Read the File
            while (reader.Read())
            {
                //checking where read text is element and and name is “DataSource”
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "DataSource")
                {
                    if (test_debug)
                        ConnectionTest += "\nReading data source...";

                    //assigning ReadElementstring to strCmb1.
                    string datasource = reader.ReadElementString();

                    if (test_debug)
                        ConnectionTest += "\nData source = " + db_datasource;
                }
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "Security")
                {
                    if (test_debug)
                        ConnectionTest += "\nReading security...";

                    string security = reader.ReadElementString();

                    if (test_debug)
                        ConnectionTest += "\nSecurity = " + db_security;
                }
            }
            if (test_debug)
                ConnectionTest += "\nClosing connection xml file...";

            reader.Close();
            reader = null;

            if (test_debug)
                ConnectionTest += "\nSuccess retrieving encrypted connection...";

            result = true;
        }
        else
        {
            if (test_debug)
                ConnectionTest += "\nLost connection xml file, could not be found at: " + xmlSettingsFilePath;
            throw new Exception("The configuration file, setup for database connectivity could not be found.");
        }
    }
    catch (Exception ex)
    {
        if (test_debug)
            ConnectionTest += "\nError occured while setting data source and security:\n\t - " + ex.Message;
        throw ex;
    }
    return result;
}
麦加纳格

您要绑定的属性是TestLink,它不会通知其更改。相反,您可以公开Tester实例本身:

public string Tester
{
    get { return tester; }
}

现在,您只需绑定到Tester.Test-即可获取更改通知:

<TextBox Name="txtTestMessage" Text="{Binding Tester.Test}" />

编辑

要使用长时间运行的任务连续更新UI,您需要使用后台线程。UI更新(即,设置“ Test”)需要分派回UI线程。这是一个例子:

public void dotest(){
    var dummyAction = new Action( () => Thread.Sleep(1000) );
    var first = new Task(dummyAction);
    var second = new Task(dummyAction);
    var third = new Task(dummyAction);

    first.ContinueWith(task =>
    {
        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            Test = Environment.NewLine + "past point one";
        }));
        second.Start();
    });
    second.ContinueWith(task =>
    {
        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            Test += Environment.NewLine + "past point two";
        }));
        third.Start();
    });
    third.ContinueWith(task => {
        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            Test += Environment.NewLine + "Finished testing";
        }));
    });
    first.Start();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将文本框绑定到WPF中的类的字段?

来自分类Dev

如何将文本框对象绑定到ViewModel

来自分类Dev

如何将文本框绑定到不在数据上下文类中的类

来自分类Dev

如何将文本框的长度绑定到文本块?

来自分类Dev

如何将文本框文本绑定到集合的“当前”项目

来自分类Dev

如何将文本框的文本与文件内容绑定?

来自分类Dev

如何将xaml绑定到来自其他类的文本框

来自分类Dev

如何将Winform文本框绑定到类属性?

来自分类Dev

如何将文本框中的字体大小绑定到数据源?

来自分类Dev

如何将简单的字符串值绑定到文本框?

来自分类Dev

如何将2个文本框绑定到一个属性?

来自分类Dev

如何将列表绑定到ItemsControl中的文本框

来自分类Dev

如何将文本框绑定到MS Access中子窗体的链接子字段?

来自分类Dev

如何将ProgressBar值绑定到ResourceDictionary中的文本框?

来自分类Dev

将文本框绑定到属性

来自分类Dev

将文本框绑定到字典

来自分类Dev

将文本框绑定到属性

来自分类Dev

如何将selectedItem从不同的列表框绑定到一个文本框?

来自分类Dev

如何将焦点设置到dx文本框?

来自分类Dev

如何将文本框绑定到datetime字段,但仅显示其日期部分(在ASP.MVC中)?

来自分类Dev

如何将文本框绑定到datetime字段,但仅显示其日期部分(在ASP.MVC中)?

来自分类Dev

实体框架和 VB.Net - 如何将文本框绑定到 EF 并保持更改?

来自分类Dev

如何将文本框文本与其他类属性绑定?

来自分类Dev

如何将对象属性绑定到 angular2 中的文本框

来自分类Dev

TwoWay将DateTime绑定到文本框-仅年份

来自分类Dev

将多个文本框值绑定到单个属性

来自分类Dev

将文本框绑定到字典的键

来自分类Dev

将List <string>绑定到文本框

来自分类Dev

将文本框值绑定到WPF中的模型

Related 相关文章

  1. 1

    如何将文本框绑定到WPF中的类的字段?

  2. 2

    如何将文本框对象绑定到ViewModel

  3. 3

    如何将文本框绑定到不在数据上下文类中的类

  4. 4

    如何将文本框的长度绑定到文本块?

  5. 5

    如何将文本框文本绑定到集合的“当前”项目

  6. 6

    如何将文本框的文本与文件内容绑定?

  7. 7

    如何将xaml绑定到来自其他类的文本框

  8. 8

    如何将Winform文本框绑定到类属性?

  9. 9

    如何将文本框中的字体大小绑定到数据源?

  10. 10

    如何将简单的字符串值绑定到文本框?

  11. 11

    如何将2个文本框绑定到一个属性?

  12. 12

    如何将列表绑定到ItemsControl中的文本框

  13. 13

    如何将文本框绑定到MS Access中子窗体的链接子字段?

  14. 14

    如何将ProgressBar值绑定到ResourceDictionary中的文本框?

  15. 15

    将文本框绑定到属性

  16. 16

    将文本框绑定到字典

  17. 17

    将文本框绑定到属性

  18. 18

    如何将selectedItem从不同的列表框绑定到一个文本框?

  19. 19

    如何将焦点设置到dx文本框?

  20. 20

    如何将文本框绑定到datetime字段,但仅显示其日期部分(在ASP.MVC中)?

  21. 21

    如何将文本框绑定到datetime字段,但仅显示其日期部分(在ASP.MVC中)?

  22. 22

    实体框架和 VB.Net - 如何将文本框绑定到 EF 并保持更改?

  23. 23

    如何将文本框文本与其他类属性绑定?

  24. 24

    如何将对象属性绑定到 angular2 中的文本框

  25. 25

    TwoWay将DateTime绑定到文本框-仅年份

  26. 26

    将多个文本框值绑定到单个属性

  27. 27

    将文本框绑定到字典的键

  28. 28

    将List <string>绑定到文本框

  29. 29

    将文本框值绑定到WPF中的模型

热门标签

归档