Bind-Taste in der DataTemplate-Kommando in der form s ViewModel

Mein problem ist ähnlich wie in dieser Frage:

WPF-MVVM-Button-Steuerelement-Bindung im DataTemplate

Hier ist mein 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>

Es ist nur ein ListBoxgebunden an ein ObservableCollection<string> namens CommandSets (die im ViewModel).

Diese Bindung funktioniert (es zeigt eine Schaltfläche für jedes Element in der Auflistung).

Nun will ich binden Sie die Taste, um einen Befehl (FireCommand), die auch im ViewModel.

Hier ist der relevante Teil der 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");
    }
}

Die Bindung dieser Taste funktioniert NICHT.

Von dem, was ich verstanden habe von der Frage ich oben gelinkt, die Bindung funktioniert nicht, weil:

(korrigiert mich wenn ich falsch Liege)

  • Der button ist innerhalb des ListBoxso dass es nur "weiß" die Bindung der ListBox (die ObservableCollectionin diesem Fall), aber nicht die Bindung des Hauptfensters
  • Ich bin versucht zu binden, um einen Befehl in der main-ViewModel der wichtigsten Fenster (das der button nicht "wissen")

Den Befehl selbst ist definitiv richtig, denn wenn ich den button außerhalb die ListBox (finden Sie unter XAML-oben für ein Beispiel), die Bindung funktioniert, und der Befehl wird ausgeführt.

Anscheinend, dass ich "nur" das Bedürfnis zu erzählen, die Taste zu binden, um die Haupt-ViewModel von der form.

Aber ich bin nicht in der Lage, herauszufinden, die richtige XAML-syntax.

Habe ich versucht mehrere Ansätze, die ich gefunden nach etwas googlen, aber keiner von Ihnen arbeitete für mich:

<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}}}" />

Könnte bitte jemand:

  1. gib mir die richtigen XAML, binden wir den button in der ListBox auf einen Befehl in der form MainViewModel?
  2. zeigen Sie mir einen link, wo diese erweiterte, verbindliche Zeug ist, erklärte in einer Weise, dass ein WPF/MVVM-Anfänger verstehen können?

    Ich fühle mich wie ich bin nur kopieren und einfügen Arkane XAML-Beschwörungen, und so weit ich habe keine Ahnung (und kann nicht finden, eine gute Dokumentation), wie würde ich herausfinden, indem ich mich in die Fälle, die ich brauchen würde RelativeSource oder StaticResource oder was auch immer anstelle der "normalen" Bindung.

InformationsquelleAutor der Frage Christian Specht | 2012-09-10

Schreibe einen Kommentar