如何在XAML UI中更新网格?

时间:2014-04-18 15:51:41

标签: c# wpf

我正在使用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()

2 个答案:

答案 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逻辑使其复杂化。