Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在XAML UI中更新网格?_C#_Wpf - Fatal编程技术网

C# 如何在XAML UI中更新网格?

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方法。理论上应该

我使用的是C#WPF,VS2013

这是我的
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");
    }
}