web-dev-qa-db-ja.com

Xamarin.FormsページでXAMLからCommandParameterとしてボタンを渡すにはどうすればよいですか?

独自のCommandとしてXamarin.Forms.ButtonCommandParameterとして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}}"を試しましたが、うまくいきませんでした。

おかげで、

13

Xamarin.Formsには、それを行う参照マークアップ拡張機能があります。

<Button x:Name="myButton"
    Text="My Button"
    Command="{Binding ButtonClickCommand}"
    CommandParameter="{x:Reference myButton}"/>

しかし、これが私がこの必要性を目にしたのは初めてであり、おそらくビューをビューモデルから分離して、よりきれいなパターンを使用するか、notボタン間でコマンドを共有します。

21
 <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'}を指定するだけです。

0
Alex Anderson