Bouton Lier dans DataTemplate pour commander dans le ViewModel du formulaire

Mon problème est similaire à celui décrit dans cette question:
WPF MVVM Bouton de Contrôle de Liaison dans DataTemplate

Voici mon code XAML:

<Window x:Class="MissileSharp.Launcher.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MissileSharp Launcher" Height="350" Width="525">
    <Grid>
        <!-- when I put the button here (outside the list), the binding works -->
        <!--<Button Content="test" Command="{Binding Path=FireCommand}" />-->
        <ListBox ItemsSource="{Binding CommandSets}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <!-- I need the button here (inside the list), and here the binding does NOT work -->
                    <Button Content="{Binding}" Command="{Binding Path=FireCommand}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

C'est juste un ListBoxlié à un ObservableCollection<string> nommé CommandSets (qui est dans le ViewModel).
Cette liaison fonctionne (il affiche un bouton pour chaque élément de la collection).

Maintenant, je veux lier le bouton de commande (FireCommand), qui est aussi dans le ViewModel.
Voici la partie pertinente de la ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged
{
    public ICommand FireCommand { get; set; }
    public ObservableCollection<string> CommandSets { get; set; }

    public MainWindowViewModel()
    {
        this.FireCommand = new RelayCommand(new Action<object>(this.FireMissile));
    }

    private void FireMissile(Object obj)
    {
        System.Windows.MessageBox.Show("fire");
    }
}

La liaison de ce bouton ne fonctionne PAS.
De ce que j'ai compris de la question j'ai lié ci-dessus, la liaison ne fonctionne pas parce que:
(corrigez-moi si je me trompe)

  • Le bouton est à l'intérieur de la ListBoxdonc il ne "sait" la liaison de la ListBox (le ObservableCollectiondans ce cas), mais pas la liaison de la fenêtre principale
  • Je suis en train d'essayer de se lier à une commande dans le ViewModel principal de la fenêtre principale (le bouton n'est pas "savoir"),

La commande elle-même est correcte, parce que quand je mets le bouton à l'extérieur la ListBox (voir le code XAML ci-dessus pour un exemple), la liaison fonctionne et que la commande est exécutée.

Apparemment, j'ai "juste" besoin de dire le bouton pour lier le principal ViewModel de la forme.
Mais je ne suis pas en mesure de trouver la bonne syntaxe XAML.

J'ai essayé plusieurs approches que j'ai trouvé après quelques recherches sur google, mais aucun d'eux n'a fonctionné pour moi:

<Button Content="{Binding}" Command="{Binding RelativeSource={RelativeSource Window}, Path=DataContext.FireCommand}" />

<Button Content="{Binding}" Command="{Binding Path=FireCommand, Source={StaticResource MainWindow}}" />

<Button Content="{Binding}" Command="{Binding Path=FireCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

Quelqu'un pourrait s'il vous plaît:

  1. me donner le bon code XAML pour lier le bouton à l'intérieur de la ListBox à une commande dans le formulaire de MainViewModel?
  2. m'indiquer un lien où cette avancée de liaison des choses est expliqué d'une manière qui WPF/MVVM débutant peut comprendre?
    Je me sens comme si je suis juste de copier et de coller des arcanes XAML incantations, et jusqu'à présent je n'ai pas la moindre idée (et ne peut pas trouver une bonne documentation) comment je pourrais comprendre par moi-même, auquel cas j'aurais besoin d' RelativeSource ou StaticResource ou que ce soit au lieu de "normal" de la liaison.

source d'informationauteur Christian Specht