独自のCommand
としてXamarin.Forms.Button
をCommandParameter
としてViewModelに渡したいのですが。私は例えばこれの背後にあるコードからこれを達成する方法を知っています。 ...
[〜#〜] xaml [〜#〜](簡潔にするために、ほとんどのプロパティを省略しています)
<Button x:Name="myButton"
Text="My Button"
Command="{Binding ButtonClickCommand}"/>
XAML.cs
public partial class MyTestPage
{
public MyTestPage()
{
InitializeComponent();
myButton.CommandParameter = myButton;
}
}
ViewModel
public class MyViewModel : ViewModelBase
{
public MyViewModel()
{
ButtonClickCommand = new Command(
(parameter) =>
{
var view = parameter as Xamarin.Forms.Button;
if (view != null)
{
// Do Stuff
}
});
}
public ICommand ButtonClickCommand { get; private set; }
}
...しかし、XAML自体でCommandParameter
を宣言することは可能ですか?または言い換えると、ボタン自体にパラメーターを設定するためのバインディング構文は何ですか?
<Button x:Name="myButton"
Text="My Button"
Command="{Binding ButtonClickCommand}"
CommandParameter="{[WHAT WOULD GO HERE]}"/>
ところで私はすでにCommandParameter="{Binding RelativeSource={RelativeSource Self}}"
を試しましたが、うまくいきませんでした。
おかげで、
Xamarin.Forms
には、それを行う参照マークアップ拡張機能があります。
<Button x:Name="myButton"
Text="My Button"
Command="{Binding ButtonClickCommand}"
CommandParameter="{x:Reference myButton}"/>
しかし、これが私がこの必要性を目にしたのは初めてであり、おそらくビューをビューモデルから分離して、よりきれいなパターンを使用するか、notボタン間でコマンドを共有します。
<Button x:Name="myButton"
Text="My Button"
Command="{Binding ButtonClickCommand}"
CommandParameter="{x:Reference myButton}"/>
ViewModel
public YourViewModel()
{
ButtonClickCommand= new Command(ButtonClicked);
}
private async void ButtonClicked(object sender)
{
var view = sender as Xamarin.Forms.Button;
}
<Button x:Name="myButton"
Text="My Button"
Command="{Binding ButtonClickCommand}"
CommandParameter={Binding RelativeSource=
{RelativeSource
Mode=FindAncestor,
AncestorType={x:Type Button}}/>
動作するはずですが、ボタンが必要なのはなぜでしょうか。 MVVMのポイントは、データとUIを分離することです。ボタンに対して行う必要があるすべてのことは、DataBindingsを介して行うことができます。
上記が機能しない場合は、ボタンにx:KeyとCommandParamter = {StaticResource 'x:Key'}を指定するだけです。