2009-05-16 5 views
1

je le contenu suivant dans un Window (sections supprimées inutiles):WPF: Est-il possible de convertir le code suivant de Procedural (C#) en Declarative (XAML)?

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 derrière):

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

maintenant ce que je veux faire est de convertir le mélange ci-dessus de xaml sd C# à quelque chose qui est purement et simplement xaml, pour tirer parti du modèle DataBinding de WPF. Je pense que cela nécessite quelque chose comme un déclencheur d'événement et une combinaison de liaison de données avec l'élément sélectionné de l'élément itemscontrol ou quelque chose comme ça, mais je ne suis pas sûr de la façon de procéder.

Quelqu'un peut-il me guider à la façon dont je peux convertir la solution ci-dessus pour supprimer le code de procédure?

Répondre

1

Si vous utilisez .NET 3.5SP1, vous pouvez probablement utiliser la nouvelle extension de balisage de liaison StringFormat pour le faire. Voir here pour des exemples de liaison avec StringFormat.

Si .NET 3.5SP1 n'est pas une option, vous devrez probablement créer votre propre ValueConverter. Liez la valeur de la propriété SourceUrl à l'ID de l'artiste sélectionné, puis dans votre convertisseur, renvoyez la même chaîne que celle que vous utilisez dans l'exemple C# ci-dessus.

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

Cela ne fonctionne pas: System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec la référence 'ElementName = artist_list'. BindingExpression: Path = SelectedItem.ID; DataItem = null; l'élément cible est 'RSSViewer' (Name = 'rssControl'); La propriété target est 'SourceUrl' (type 'String') –

+0

Je ne pense pas que ItemsControl ait une propriété SelectedItems. Si vous voulez une sélection, vous devez utiliser une ListBox ou une ListView. – Andy

+0

Andy a raison, ItemsControl n'a pas de propriété SelectedItem ... donc nous devons le faire d'une autre façon, alors –

Questions connexes