2015-08-18 9 views
13

Tôi đang cố gắng chuyển CommandParameter cho phương thức trong ViewModel của mình. Cách thực hiện việc này?Truyền tham số lệnh vào phương thức trong ViewModel trong WPF?

private void Open(object sender) 
{ 
    if (sender==this.objMainWindow.btnHistory) 
    { 
     objMainWindow.Container.Child = objHistory; 
    } 

    if (sender == this.objMainWindow.btnNew_Item) 
    { 
     objMainWindow.Container.Child = objNewItem; 
    } 

    if (sender == this.objMainWindow.btnSide_Effects) 
    { 
     objMainWindow.Container.Child = objSideEffect; 
    } 
} 

Đây là meyhod tôi trong ViewModel mà tôi muốn vượt qua CommandParameter. Tôi sử dụng nút CommandParameter cho nút.

Trả lời

25

"ViewModel" ngụ ý MVVM. Nếu bạn đang thực hiện MVVM, bạn không nên chuyển lượt xem sang các kiểu xem của mình. Thông thường bạn làm điều gì đó như thế này trong XAML của bạn:

<Button Content="Edit" 
     Command="{Binding EditCommand}" 
     CommandParameter="{Binding ViewModelItem}" > 

Và sau đó này trong mô hình quan điểm của bạn:

private ViewModelItemType _ViewModelItem; 
public ViewModelItemType ViewModelItem 
{ 
    get 
    { 
     return this._ViewModelItem; 
    } 
    set 
    { 
     this._ViewModelItem = value; 
     RaisePropertyChanged(() => this.ViewModelItem); 
    } 
} 

public ICommand EditCommand { get { return new RelayCommand<ViewModelItemType>(OnEdit); } } 
private void OnEdit(ViewModelItemType itemToEdit) 
{ 
    ... do something here... 
} 

Rõ ràng đây chỉ là để minh họa cho điểm, nếu bạn chỉ có một tài sản để sửa gọi ViewModelItem sau đó bạn sẽ không cần phải vượt qua nó như là một tham số lệnh.

+0

cách sử dụng RaisePropertyChanged()? – Mahsa

+0

Đó chỉ là việc thực hiện thông báo thay đổi tài sản MVVM Lite sử dụng mà bạn có thể thêm thông qua NuGet (lấy được mô hình xem của bạn từ ViewModelBase). Có rất nhiều cách khác để làm điều đó mặc dù bao gồm cả những người được hiển thị [ở đây] (https://msdn.microsoft.com/en-us/library/vstudio/ms743695 (v = vs.100) .aspx) và [ở đây] (http://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist). –

5

Nếu bạn rằng đặc biệt để vượt qua các yếu tố để ViewModel Bạn có thể sử dụng

CommandParameter="{Binding ElementName=ManualParcelScanScreen}" 
0

Chỉ cần sử dụng cú pháp Ràng buộc dữ liệu. Ví dụ:

<Buttton x:Name="btn" 
     Content="Click" 
     Command="{Binding ClickCmd}" 
     CommandParameter="{Binding ElementName=btn,Path=Content}" /> 

Chúng tôi không chỉ có thể sử dụng Ràng buộc dữ liệu để lấy dữ liệu từ Mô hình xem mà còn chuyển dữ liệu về Mô hình xem. Trong CommandParameter, phải sử dụng ElementName để khai báo nguồn ràng buộc một cách rõ ràng.

Các vấn đề liên quan