C# 如何在XAML UI中更新网格?
我使用的是C#WPF,VS2013 这是我的C# 如何在XAML UI中更新网格?,c#,wpf,C#,Wpf,我使用的是C#WPF,VS2013 这是我的main窗口类定义: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public void addData(){ //this is the method I want to access } ... } 我想使用另一个类中的addData方法。理论上应该
main窗口
类定义:
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();
}
}
我可以访问它,但最后我有两个main窗口
如果我将addData()
的方法定义更改为public static void addData()
,那么它可以从外部类(DataEntry
)访问,但是我不能从addData()
方法访问我的文本框,并根据计算出的值操作UI,只需从方法返回值即可。让调用该类的UI从该方法获取返回值,并对其执行任何需要执行的操作,例如设置textbox值
除了更简单之外,这还具有大大减少应用程序耦合的优点。您的业务逻辑现在不需要与这个特定的UI一起使用。您可以创建此逻辑的完全不同的表示形式,而无需复制它;您无需访问UI即可对其进行测试;它可以独立地编写、维护和推理,而不是用一堆UI逻辑使其复杂化。这是一个合理的直觉假设,它在很多环境中都是正确的,但在XAML中却不正确。在XAML中,您做的事情非常不同:您将数据放入网格知道如何检查的内容中,向网格显示这些内容,网格处理填充自身的细节
它是声明性的。你想说什么就说什么:“我想把这些东西列在表格里。”。让网格第一百万次摆弄递增的i
网格中的数据应该位于ObservableCollection(我们称之为GridItems)中,它应该是视图模型类的公共属性。如果您没有视图模型,那么是时候编写一个了——我们称之为MainWindowViewModel。它不一定要做很多事情。这就是数据所在的位置,以及加载和保存数据的函数。视图(您的主窗口)负责向用户显示数据,并公开要加载和保存的菜单项或按钮等。但主窗口只公开这些控件,并将它们绑定到视图模型公开的命令。MainWindow知道这些命令的名称,但他不知道它们的含义
MainWindowViewModel实例已分配给MainWindow.DataContext。DataGrid的ItemsSource属性应绑定到GridItems
<DataGrid ItemsSource="{Binding GridItems}" ...>
<!-- columns, etc. -->
</DataGrid>
另外,我也同意,如果您对编程足够陌生,创建MainWindow的新实例似乎是更新旧实例的一种可行方法,那么教程将是一个好主意 我认为您对C#编程比较陌生,也许对一般编程也比较陌生。虽然你的问题在这里很合适,但我也可以建议你在网上寻找初学者教程吗?你不应该从这样一个非UI类开始访问你的UI。业务逻辑应该不需要了解UI就可以完成它的工作。好吧,我需要以某种方式将数据添加到我的DataGrid
,它只能从main窗口
类中获得。除非有办法从DataEntry
类中的方法访问DataGrid
,否则我找不到任何方法。Silverlight/WPF根据其自身的基本原理工作。数据绑定、依赖属性、资源、DataContext、INotifyPropertyChanged接口等。如果您理解这些概念,这对您来说可能是一项微不足道的任务。虽然,你真的需要帮助吗,让我知道。但是。。。我想将项目(包含数据的行)添加到我的DataGrid
。我不在乎更新它。我只想将三个不同类的数据添加到一个DataGrid
。我唯一的问题是,我不知道如何“告诉”程序“使用在main window
中创建的DataGrid
”。如果将该GridItems集合绑定到网格的ItemsSource属性,并将项添加到GridItems,它们将被添加到网格中。如果网格中可见的内容发生更改(例如,它显示新添加的行),则网格已更新。更新意味着它改变了显示的内容。你确实关心更新它。“更新”是指你想做的事情。我终于明白了!谢谢大家!@安东尼奥佩特罗夫太棒了!
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");
}
}