如何解决如何在单击按钮时将文本分配给从文件读取的TextBlock
我的应用必须从文件系统中加载.txt
文件,将其读取并将其文本放入TextBlock
中,但是我不知道如何将Button
连接到我的视图模型,因此绑定到其中属性的文本块将显示此文本。
让我重复我希望我的应用执行的操作:
- 用户单击加载按钮,然后选择一个
.txt
文件 - 文件中的文本已分配给
NumbersString
属性 - 该文本块从
NumbersString
属性中加载该文本
我不知道如何执行第2步。
XAML
<Button Name="load" Background="Pink" Click="load_Click">Load File</Button>
<TextBox x:Name="numbers1" Text="{Binding NumbersString,UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
XAML的代码隐藏
我的视图模型属性NumbersString
出错。它应该连接到按钮。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new numbersViewModel();
}
public void load_Click(object sender,RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
NumbersString = File.ReadAllText(openFileDialog.FileName);
}
}
查看模型
class numbersViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private numbersModel _model;
protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler evt = PropertyChanged;
if (evt != null)
evt(this,new PropertyChangedEventArgs(propertyName));
}
// iI want my text block to take the string from here
public string NumbersString
{
get { return _model.numbersString; }
set
{
if (value != _model.numbersString)
{
_model.numbersString = value;
RaisePropertyChanged("numbers1");
}
}
}
}
型号
private string model="";
public string numbersString
{
get
{
return model;
}
set
{
model = value;
}
}
解决方法
您在numbers1
属性中引发了NumbersString
的属性更改事件,因此触发了对错误属性(甚至不存在)的更改,但不会更新{{1 }}。
在对TextBox
的调用中调整属性名称。您可以使用nameof
代替硬编码的RaisePropertyChanged
。
string
由于您同时使用了代码隐藏和MVVM,因此可以在事件处理程序中设置public string NumbersString
{
get { return _model.numbersString; }
set
{
if (value != _model.numbersString)
{
_model.numbersString = value;
RaisePropertyChanged(nameof(NumbersString));
}
}
}
属性,如下所示:
NumbersString
要使它起作用的最后一点是,您永远不要在public void load_Click(object sender,RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
((numbersViewModel)DataContext).NumbersString = File.ReadAllText(openFileDialog.FileName);
}
的{{1}}属性上创建numbersModel
实例或将其分配给该实例。您可以在构造函数中做到这一点。
_model
使用命令的MVVM方法
应该使用命令而不是使用事件处理程序来进行按钮单击。您可以复制@aepot linked的numbersViewModel
类。首先,您在public numbersViewModel(numbersModel numbersModel)
{
_model = numbersModel;
}
中创建一个RelayCommand
属性。
ICommand
numbersViewModel
实现public ICommand LoadFile { get; }
接口,并将执行逻辑委托给在RelayCommand
的构造函数中创建该方法时必须通过的方法:
ICommand
numbersViewModel
方法包含用于加载文件和读取其文本的逻辑。实际上,这也违反了MVVM原理,因为该方法位于视图模型中,并且public numbersViewModel(numbersModel numbersModel)
{
_model = numbersModel;
LoadFile = new RelayCommand(ExecuteLoadFile);
}
是视图类型。您将把这一部分提取到带有接口的服务中,以使视图模型不知道其实现,但这超出了此问题的范围。
ExecuteLoadFile
最后,将按钮上的OpenFileDialog
属性绑定到private void ExecuteLoadFile(object obj)
{
var openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog().GetValueOrDefault())
NumbersString = File.ReadAllText(openFileDialog.FileName);
}
命令。
Command
通过这些更改,您可以从LoadFile
中删除事件处理程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。