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 ListBox
gebunden 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
ListBox
so dass es nur "weiß" die Bindung derListBox
(dieObservableCollection
in 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:
- gib mir die richtigen XAML, binden wir den button in der
ListBox
auf einen Befehl in der formMainViewModel
? - 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ürdeRelativeSource
oderStaticResource
oder was auch immer anstelle der "normalen" Bindung.
InformationsquelleAutor der Frage Christian Specht | 2012-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist:
Keine Notwendigkeit zu Fuß bis zur Wurzel-es sei denn, Sie tatsächlich die
DataContext
auf dem Weg, aber als dieListBox
scheint sich zu binden, eine Eigenschaft, die auf der VM-das sollte genug sein.Die einzige Sache, die ich empfehle die Lektüre ist die Datenbindung Überblickund die
Binding
Klasse Dokumentation (inklusive Ihrer Eigenschaften).Auch hier ist eine kurze Erklärung, wie Bindungen aufgebaut sind: Eine Bindung besteht aus einem Quelle und ein
Path
relative Quellestandardmäßig die Quelle wird die aktuelleDataContext
. Quellen, die explizit festgelegt sind:Source
ElementName
&RelativeSource
. Einstellung alle diejenigen außer Kraft, dieDataContext
als Quelle.Also, wenn Sie einen Quelle wie
RelativeSource
und zugreifen möchten, die etwas in derDataContext
auf dieser Ebene dieDataContext
angezeigt werden muss in derPath
.InformationsquelleAutor der Antwort H.B.