如何在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 UI中更新网格

这是一个合理的直观假设,在很多环境中都是正确的,但在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逻辑使其复杂化。