2009-05-16 10 views
1

Ich habe den folgenden Inhalt in ein Window (entfernt unnötigen Abschnitten):WPF: Kann der folgende Code von Prozedur (C#) in Deklarativ (XAML) konvertiert werden?

XAML:

<Style x:Key="itemstyle" TargetType="{x:Type ContentPresenter}"> 
     <EventSetter Event="MouseLeftButtonDown" Handler="HandleItemClick"/> 
</Style> 

<ItemsControl ItemsSource="{Binding ArtistList}" Margin="10" Name="artist_list" ItemContainerStyle="{StaticResource itemstyle}" > 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
       <TextBlock Text="{Binding ID}" Foreground="White"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

<Controls:RSSViewer x:Name="rssControl" /> 

C# (Code hinter):

private void HandleItemClick(object sender, MouseButtonEventArgs e) 
{ 
    var selectedArtist = ((ContentPresenter) sender).Content as Artist; 
    rssControl.SourceUrl = "http://agnt666laptop:28666/rss.aspx?artistid=" + selectedArtist.ID; 
} 

Jetzt was ich tun möchte, ist die obige Mischung von Xaml a konvertieren nd C# zu etwas, das rein und ausschließlich xaml ist, um das DataBinding-Modell von WPF zu nutzen.

Ich denke, dass es so etwas wie einen Ereignisauslöser und eine Kombination von Datenbindung mit dem ausgewählten Element des Elementes control Element oder etwas ähnliches erfordert, aber ich bin mir nicht sicher, wie es geht.

Kann mir jemand sagen, wie ich die obige Lösung konvertieren kann, um den prozeduralen Code zu entfernen?

Antwort

1

Wenn Sie .NET 3.5SP1 verwenden, können Sie wahrscheinlich die neue Binding-Markup-Erweiterung StringFormat verwenden. Beispiele für die Bindung mit StringFormat finden Sie unter here.

Wenn .NET 3.5SP1 keine Option ist, müssen Sie wahrscheinlich Ihren eigenen ValueConverter erstellen. Binden Sie den Wert der SourceUrl-Eigenschaft an die ID des ausgewählten Interpreten, und geben Sie dann in Ihrem Konverter dieselbe Zeichenfolge zurück, die Sie im obigen C# -Beispiel verwenden.

0
<ItemsControl ItemsSource="{Binding ArtistList}" Margin="10" Name="artist_list" ItemContainerStyle="{StaticResource itemstyle}" > 
     <ItemsControl.ItemTemplate> 
       <DataTemplate> 
           <TextBlock Text="{Binding ID}" Foreground="White"/> 
       </DataTemplate> 
     </ItemsControl.ItemTemplate> 
</ItemsControl> 

<Controls:RSSViewer x:Name="rssControl" SourceUrl="{Binding SelectedItem.ID, ElementName=artist_list, StringFormat= 'http://agnt666laptop:28666/rss.aspx?artistid={0}' }" /> 
+0

Es funktioniert nicht: System.Windows.Data Fehler: 4: Die Quelle für die Bindung mit der Referenz 'ElementName = artist_list' kann nicht gefunden werden. BindingExpression: Pfad = SelectedItem.ID; Datenelement = null; Zielelement ist 'RSSViewer' (Name = 'rssControl'); target-Eigenschaft ist 'SourceUrl' (Typ 'String') –

+0

Ich glaube nicht, dass ItemsControl eine SelectedItems-Eigenschaft hat. Wenn Sie eine Auswahl wünschen, müssen Sie eine ListBox oder ListView verwenden. – Andy

+0

Andys Recht, ItemsControl hat keine SelectedItem-Eigenschaft ... also müssen wir es anders machen als –