簡體   English   中英

在ICommand實現,ViewModel和View之間共享數據

[英]Share data between ICommand implementation, ViewModel and View

我正在.net中做我的第一個項目,我正在嘗試使用MVVM模式。 如何在ViewModel和ICommand類之間共享數據? 我的ViewModel看起來像這樣:

public class WorkClass : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private Book mybook;
    private ObservableCollection<Book> bookList;

    public Book Mybook
    {
        get { return mybook; }
        set
        {
            book = value;
            OnPropertyChanged("Mybook");
        }
    }

    public ObservableCollection<Book> BookList
    {
        get { return bookList; }
        private set
        {
            bookList = value;
            OnPropertyChanged("BookList");
        }
    }

    testCommand2 test = new testCommand2();

    public ICommand Test { get { return test; } }

    private class testCommand2 : ICommand
    {

        public void Execute(object parameter)
        {
            // Do stuff here
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

我將ICommand實現為內部類,但我也嘗試了“獨立”類,但也無法使它正常工作。 我希望我的命令“ test”能夠與WorkClass屬性BookList和Mybook一起使用並共享數據。 (本書是我定義的類,僅包含一些字符串屬性)

我的應用程序現在有兩個窗口,在主窗口中,我創建WorkClass的實例並將其插入到其datacontext中。 然后我將其通過datacontext傳遞到其他這樣的窗口(這是正確的嗎?):

Window1 w = new Window1();
w.DataContext = this.DataContext;
w.ShowDialog();

我希望這些窗口中的命令對此WorkClass實例中的數據執行更改。 我希望我的要求很清楚。 我知道最好使用Internet上可用的RelayCommand或DelegateCommand類,但是由於這是學校的項目,所以我擔心它將被視為復制他人的作品。

如果您需要我從代碼中發布更多內容或解釋我將要編輯的任何內容。

謝謝你的幫助。

您需要通過視圖模型實例初始化命令,並將命令執行委托給視圖模型類的方法

public class WorkClass : INotifyPropertyChanged
{

    public WorkClass()
    {
        test = new testCommand2(this);
    }

    // Will be called on command execturion
    public Test2Action()
    {
    }

public event PropertyChangedEventHandler PropertyChanged;
private Book mybook;
private ObservableCollection<Book> bookList;

public Book Mybook
{
    get { return mybook; }
    set
    {
        book = value;
        OnPropertyChanged("Mybook");
    }
}

public ObservableCollection<Book> BookList
{
    get { return bookList; }
    private set
    {
        bookList = value;
        OnPropertyChanged("BookList");
    }
}

testCommand2 test;

public ICommand Test { get { return test; } }

private class testCommand2 : ICommand
{
    private readonly WorkClass _wc;

    public testCommand2(WorkClass wc)
    {
       _wc = wc;
    }

    public void Execute(object parameter)
    {
        _wc.Test2Action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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