如何在XAML UI中更新网格
本文关键字:更新 网格 UI XAML | 更新日期: 2023-09-27 17:58:52
我使用的是C#WPF,VS2013。
这是我的MainWindow
类定义:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void addData(){
//this is the method I want to access
}
...
}
我想使用另一个类中的addData
方法。理论上应该是这样的:
public class DataEntry
{
public void randomMethod()
{
MainWindow.addData(); //this doesn't work - the addData method can not be accessed
}
}
如果我这样做:
public class DataEntry
{
public void randomMethod()
{
MainWindow mw = new MainWindow()
mw.addData();
}
}
我可以访问它,但后来我得到了两个MainWindow
s。
如果我将addData()
的方法定义更改为public static void addData()
,则可以从外部类(DataEntry
)访问它,但不能从addData()
方法访问我的TextBox
。
这是一个合理的直观假设,在很多环境中都是正确的,但在XAML中则不然。在XAML中,你可以做一些非常不同的事情:你把数据放在网格知道如何检查的东西中,你把它展示给网格,网格处理填充自己的细节。
这是声明性的。你想说什么就说什么:"我想把这个列表放在网格里"。让网格第一百万次通过递增i
来摆弄。
进入网格的数据应该在ObservableCollection(我们称之为GridItems)中,它应该是视图模型类的公共属性。如果您没有视图模型,那么是时候编写一个了——我们称之为MainWindowViewModel。它不一定要做很多事情。这就是数据所在的地方,以及加载和保存数据的函数。View(您的主窗口)负责向用户显示数据,并公开要加载和保存的菜单项或按钮等。但MainWindow只是公开这些控件,并将它们绑定到视图模型公开的命令。MainWindow知道这些命令的名称,但他不知道它们的含义。
MainWindowViewModel实例已分配给MainWindow.DataContext。DataGrid的ItemsSource属性应绑定到GridItems。
<DataGrid ItemsSource="{Binding GridItems}" ...>
<!-- columns, etc. -->
</DataGrid>
当有人在视图模型上添加或删除项目时。GridItems,网格将被通知并相应地更新自身。
这是XAML中处理事情的标准方式,一旦你习惯了,它就会非常流畅。
视图模型公开事物列表很容易:只需使用ObservableCollection即可。对于非列表属性,您需要从INotifyPropertyChanged继承视图模型类,并实现该接口(请参阅Google,这没什么大不了的)。假设您的视图模型中有CurrentFileName属性。。。
private String _currentFileName;
public String CurrentFileName {
get { return _currentFileName; }
set {
_currentFileName = value;
// If you've implemented this properly, this will send out a
// notification that this property has changed. Any binding
// in MainWindow that's bound to this property will get that
// and act on it.
OnPropertyChanged("CurrentFileName");
}
}
此外,我同意,如果你对编程足够陌生,那么创建一个新的MainWindow实例似乎是更新旧实例的一种可行方式,那么教程将是一个好主意。
与其让业务逻辑了解、访问和操作UI,不如直接从方法返回值。由调用该类的UI从方法中获取返回值,并对其执行任何需要执行的操作,例如设置文本框值。
除了更简单之外,这还具有极大地减少应用程序耦合的优点。您的业务逻辑现在不需要与此特定UI一起使用。您可以创建一个完全不同的逻辑表示,而不需要复制它;您可以在不需要访问UI的情况下对其进行测试;它可以单独编写、维护和推理,而不是用一堆UI逻辑使其复杂化。