Ich versuche, CommandParameter
an die Methode in meiner ViewModel
..__ zu übergeben. Wie mache ich das?
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;
}
}
Dies ist mein meyhod in ViewModel
, den ich CommandParameter
übergeben möchte. Ich benutze CommandParameter
für die Schaltfläche.
"ViewModel" impliziert MVVM. Wenn Sie MVVM verwenden, sollten Sie keine Ansichten an Ihre Ansichtsmodelle übergeben. Normalerweise machen Sie so etwas in Ihrer XAML:
<Button Content="Edit"
Command="{Binding EditCommand}"
CommandParameter="{Binding ViewModelItem}" >
Und dann das in Ihrem Ansichtsmodell:
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...
}
Natürlich dient dies nur der Veranschaulichung. Wenn Sie nur eine Eigenschaft namens ViewModelItem zum Bearbeiten hätten, müssten Sie sie nicht als Befehlsparameter übergeben.
Wenn Sie genau so sind, um Elemente an Viewmodel zu übergeben, können Sie verwenden
CommandParameter="{Binding ElementName=ManualParcelScanScreen}"
Verwenden Sie einfach die Data Binding-Syntax. Zum Beispiel,
<Button x:Name="btn"
Content="Click"
Command="{Binding ClickCmd}"
CommandParameter="{Binding ElementName=btn,Path=Content}" />
Wir können Datenbindung nicht nur verwenden, um Daten aus Ansichtsmodellen abzurufen, sondern auch Daten an Ansichtsmodelle zurückgeben. In CommandParameter muss ElementName verwendet werden, um die Bindungsquelle explizit zu deklarieren.
Ich persönlich benutze einfach das .Tag-Attribut wie folgt:
<Button Content="Button" Click="Button_Click" Tag="{Binding .}"></Button>
Dann, um das ganze Objekt zu bekommen:
private void Button_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
var myViewModel = btn.Tag as MyViewModel;
...
}