2009-04-21 13 views
2

Wie kann ich in WPF einen Verweis auf den Befehl erhalten, den ein Hyperlink aus einer Objekteigenschaft aufrufen soll?WPF - Get Hyperlink-Befehl von Daten?

ich eine WPF-Anwendung erstellen, die MVVM Muster. Ein Listenfeld im Hauptfenster zeigt Hyperlinks an. Jeder Hyperlink ruft eine ICommand-Eigenschaft des Ansichtsmodells auf, wenn darauf geklickt wird. Wie gebe ich an, welcher ICommand aufgerufen werden soll? Hier

ist, was ich versucht habe, so weit: Die Hyperlinks in ViewModel.Hyperlinks Eigenschaft enthalten sind, die als die Itemssource für das Listenfeld gebunden ist. Die Hyperlinks Eigenschaft enthält Objekte vom Typ MyHyperlink:

public class MyHyperlink 
{ 
    public string Text { get; set; } 
    public string ViewModelCommand { get; set; } 
    public int RecordID { get; set; } 
} 

Die MyHyperlink.ViewModelCommand Eigenschaft enthält den Namen des Modellansicht ICommand, die aufgerufen werden soll, wenn der Hyperlink geklickt wird. Ich möchte diesen Wert verwenden, um einen PropertyPath für die Command-Eigenschaft des WPF-Hyperlink-Steuerelements anzugeben. Ich habe versucht, eine PropertyPath-Ressource für das Listenfeld mit dem Namen des Befehls zu erstellen, aber WPF akzeptiert dies nicht. Hier ist meine XAML:

<ListBox ItemsSource="{Binding Hyperlinks}"> 
    <ListBox.Resources> 
     <PropertyPath x:Key="CommandPath" Path="{Binding ViewModelCommand}" /> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <Hyperlink Command="{StaticResource CommandPath}" 
         CommandParameter="{Binding Path=RecordID}"> 
        <TextBlock Text="{Binding Text}" /> 
       </Hyperlink> 
      </TextBlock> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Wie gebe ich die ICommand aufgerufen werden soll, wenn der Hyperlink geklickt wird? Erstelle ich eine Ressource (wie oben gezeigt) oder auf andere Weise? Ich muss das in XAML tun - ich möchte nicht auf Code-Behind zurückgreifen. Danke für Ihre Hilfe!

Antwort

2

Ich denke, dass der obige Code nicht funktioniert, weil Hyperlink.Command vom Typ ICommand ist, nicht string. Sie müssen entweder Ihre MyHyperlink Klasse so ändern, dass ViewModelCommand auch eine ICommand ist, oder schreiben Sie eine IValueConverter, die die richtige ICommand Implementierung finden Sie den Befehlsnamen in Ihrem Ansichtsmodell gegeben.

1

Ich habe eine Lösung implementiert, die einen IValueConverter verwendet. Es ist als an article on The Code Project geschrieben. Hoffentlich wird es anderen Menschen die Straße runter helfen.

+0

In Ihrem Code Project-Artikel zu dynamischen Befehlen haben Sie erwähnt, dass es einen besseren Weg gibt, als einen IValueConverter zu verwenden. Können Sie uns das Geheimnis erzählen lassen? – dthrasher

+0

Hat nicht geschwenkt. Ich benutze IValueConverter. Also, kein Geheimnis. –