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

用户1935987

尝试使用简单的日志记录功能将我的第一个应用程序转换为TextBoxon主窗体​​。

要实现日志记录,我需要将TextBox对象放入记录器的类。

可能-不能做到这一点:)当前没有错误,但是据我了解,text的值TextBox绑定到了ViewModel,因为试图执行“空引用”异常。

记录器

public class Logger : TextWriter
{
        TextBox textBox = ViewModel.LogBox;
        public override void Write(char value)
        {
            base.Write(value);
            textBox.Dispatcher.BeginInvoke(new Action(() =>
            {
                textBox.AppendText(value.ToString());
            }));
        }

        public override Encoding Encoding
        {
            get { return System.Text.Encoding.UTF8; }
        }
}

ViewModel.cs

public class ViewModel
{
    public int ThreadCount { get; set; }
    public int ProxyTimeout { get; set; }

    public static TextBox LogBox { get; set; }
    //private TextBox _LogBox;
    //public TextBox LogBox {
    //    get { return _LogBox; }
    //    set {
    //        _LogBox = value;
    //    }
    //}
}

在btn上启动,单击MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Logger logger = new Logger();
        logger.Write("ewgewgweg");
    }
}

MainWindow.xaml

<Window
        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:tools"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="tools.MainWindow"
        mc:Ignorable="d"
        Title="Tools" Height="399.387" Width="575.46">

        <TextBox x:Name="logBox" 
            ScrollViewer.HorizontalScrollBarVisibility="Auto"
            ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalAlignment="Left" Height="137" Margin="10,222,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="394" Text="{Binding Path = LogBox, Mode=TwoWay}"/>
巴特

您的代码中有几个问题:

  • 不要将控件(TextBox引入视图模型中,如果这样做,尝试进行MVVM毫无用处。
  • TextXAML中属性必须为String类型或可以转换为字符串的类型。您正在绑定一个控件,这将导致在屏幕上显示System.Windows.Controls.TextBox(结果为.ToString())而不是实际文本。
  • 您的LogBox属性应实现INotifyPropertyChanged
  • 您不需要TwoWay绑定,因为文本从记录器流向UI,所以不需要流回。您甚至可以考虑使用TextBlock代替,或将控件设为只读,以便人们无法更改内容。
  • 您不需要静态属性或静态视图模型,请阅读有关如何通过依赖关系进行依赖注入的内容。
  • 您将通过一一追加字符来充实UI线程。考虑使用其他实现(但对于这个答案,我将不作进一步介绍)。

牢记以上所有内容,我将您的代码转换为此。

MainWindow.xaml

    <TextBox x:Name="logBox" 
             HorizontalAlignment="Left" VerticalAlignment="Top" Height="137" Margin="10,222,0,0" 
             TextWrapping="Wrap"  Width="394" Text="{Binding Path = LogBox}"/>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    private Logger _logger;

    public MainWindow()
    {
        InitializeComponent();
        var viewModel = new ViewModel();
        DataContext = viewModel;
        _logger = new Logger(viewModel); // passing ViewModel through Dependency Injection
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        _logger.Write("ewgewgweg");
    }
}

ViewModel.cs

public class ViewModel : INotifyPropertyChanged
{
    public int ThreadCount { get; set; }
    public int ProxyTimeout { get; set; }

    private string _logBox;
    public string LogBox
    {
        get { return _logBox; }
        set
        {
            _logBox = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

记录器

public class Logger : TextWriter
{
    private readonly ViewModel _viewModel;

    public Logger(ViewModel viewModel)
    {
        _viewModel = viewModel;
    }

    public override void Write(char value)
    {
        base.Write(value);
        _viewModel.LogBox += value;
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将文本框绑定到类Property

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类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

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

来自分类Dev

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

来自分类Dev

如何将当前对象绑定到文本输入?

来自分类Dev

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

来自分类Dev

如何将TreeView绑定到ViewModel?

来自分类Dev

通过代码将文本框的高度绑定到父对象

来自分类Dev

WPF + Caliburn Micro:将文本框绑定到自定义对象

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

    如何将文本框绑定到类Property

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    将文本框绑定到属性

  15. 15

    将文本框绑定到字典

  16. 16

    将文本框绑定到属性

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

    如何将当前对象绑定到文本输入?

  24. 24

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

  25. 25

    如何将TreeView绑定到ViewModel?

  26. 26

    通过代码将文本框的高度绑定到父对象

  27. 27

    WPF + Caliburn Micro:将文本框绑定到自定义对象

  28. 28

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

  29. 29

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

热门标签

归档