我正在使用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
。
如果我将addData()
的方法定义更改为public static void addData()
,那么可以从外部类(DataEntry
)访问 ,但是我不能从TextBox
方法访问我的addData()
。
答案 0 :(得分:2)
这是一个关于你如何做的合理的直观假设,并且在许多环境中都是正确的,但在XAML中却没有。在XAML中,您的工作方式完全不同:您将数据放入网格知道如何检查的内容中,将其显示到网格中,并且网格处理填充自身的详细信息。
它是声明性的。你说你想要什么:"我希望这个东西列表在网格中#34;。让网格在第一百万次递增i
时摆弄。
网格中的数据应该在ObservableCollection中(我们称之为GridItems),它应该是视图模型类的公共属性。如果您没有视图模型,那么现在是时候编写一个 - 我们将其称为MainWindowViewModel。它不一定要做很多事情。这就是数据所在的位置,以及加载和保存数据的功能。 View - 您的MainWindow - 负责向用户显示数据,并显示菜单项或按钮以加载和保存等。但MainWindow只是暴露这些控件,并将它们绑定到视图模型公开的命令。 MainWindow知道命令的命令,但他不知道它们的含义。
将MainWindowViewModel实例分配给MainWindow.DataContext。 DataGrid的ItemsSource属性应绑定到GridItems。
<DataGrid ItemsSource="{Binding GridItems}" ...>
<!-- columns, etc. -->
</DataGrid>
当某人在viewmodel.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实例似乎是一种更新旧实例的合理方式。
答案 1 :(得分:0)
不是让您的业务逻辑根据其计算的某个值了解,访问和操作UI,而只是从方法中返回值。将它保留在调用该类的UI以从该方法获取返回值并执行它需要做的任何事情,例如设置文本框值。
除了简单易用之外,它还具有大大减少应用程序耦合的优势。您的业务逻辑现在不需要 与此特定UI一起使用。您可以创建一个完全不同的逻辑表示,而无需复制它;你可以测试它而无需访问UI;它可以在隔离中编写,维护和推理,而不是用一堆UI逻辑使其复杂化。