2014-03-27 25 views
0

我正在做.net中的第一个项目,并且我尝试使用MVVM模式。我如何在我的ViewModel和我的ICommand类之间共享数据?我的视图模型是这样的:在ICommand实现,ViewModel和View之间共享数据

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作为内部类,但我也尝试过的“独立”级,但不能让它工作之一。我想让我的命令“测试”与WorkClass属性BookList和Mybook一起使用和共享数据。 (书是我只包含一些字符串属性定义的类)

我的应用程序现在有两个窗口,在主窗口中创建WorkClass的实例并将其插入到它的datacontext。然后,我将其穿过的DataContext像这样其他的窗口(这是正确的?):

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

我想从这些窗口我的命令,从该WorkClass实例执行上的数据变化。我希望我清楚自己在问什么。我知道最好使用可通过互联网获得的RelayCommand或DelegateCommand类,但由于这是项目到学校,所以恐怕会被视为抄袭其他人的工作。

如果您需要我从代码中发布更多内容或解释我将编辑的任何内容。

谢谢你的帮助。

+0

你有一个参数对你的命令的方法 - 这是否是不够的? –

+0

什么不行? –

+0

好吧,它的工作方式,但这种方式我不知道如何使用Execute方法中WorkClass的数据。当我有时间时,我会尝试Viacheslav的答案:) – xyann00

回答

0

您需要通过一个视图模型实例初始化命令,并委托命令执行到视图模型类

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)); 
    } 
} 

}