[英]How do I update a grid in my XAML UI?
我正在使用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
)訪問它,但是我無法從addData()
方法訪問我的TextBox
。
這是一個關於你如何做的合理的直觀假設,它在許多環境中都是正確的,但在XAML中卻沒有。 在XAML中,您的工作方式完全不同:您將數據放入網格知道如何檢查的內容中,將其顯示到網格中,並且網格處理填充自身的詳細信息。
這是聲明性的。 你說你想要什么:“我希望這些東西列在網格中”。 讓網格在第一百萬次遞增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實例似乎是一個更新舊實例的合理方式。
而不是讓您的業務邏輯基於其計算的某個值了解,訪問和操作UI,而只是從方法返回值。 將它保留在UI中,調用該類從方法中獲取返回值並執行它需要做的任何事情,例如設置文本框值。
除了簡單易用之外,這還具有大大減少應用程序耦合的優點。 你的業務邏輯現在並不需要用這種特殊的UI使用。 您可以創建一個完全不同的邏輯表示,而無需復制它; 你可以測試它而無需訪問UI; 它可以單獨編寫,維護和推理,而不是通過一堆UI邏輯使其復雜化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.