簡體   English   中英

如何在XAML UI中更新網格?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM