2009-10-02 8 views
2

J'ai une zone de liste qui se lie simplement à une collection. La collection a une collection enfant (StepDatas). Je voudrais lier à un compte de la collection enfant mais avec une déclaration WHERE. Je peux lier à ChildCollection.Count mais me perdre quand j'ai besoin d'ajouter l'expression lambda. Voici le XAML:Est-il possible de lier à une expression lambda dans Silverlight?

<ListBox Height="Auto" Style="{StaticResource ListBoxStyle1}" Margin="4,46,4,4" x:Name="lstLeftNavigation" Background="{x:Null}" SelectionChanged="lstLeftNavigation_SelectionChanged"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid Width="180" Margin="2,2,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" d:LayoutOverrides="Width" MinHeight="36"> 
      <TextBlock Text="{Binding StepNm}" x:Name="tbStepNm" Margin="10,0,34,0" TextWrapping="Wrap" FontFamily="Portable User Interface" Foreground="White" FontSize="10" FontWeight="Bold" VerticalAlignment="Center"/> 
      <Image Height="37" HorizontalAlignment="Right" Margin="0" VerticalAlignment="Center" Width="37" Source="Images/imgIcoChecked.png" Stretch="Fill"/> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Les travaux ci-dessus pour se lier au compte de la collection des enfants. Cependant, je souhaite montrer le nombre de la collection d'enfants où une certaine condition est remplie. Dans ce cas précis, la collection enfant a une propriété complétée (bool). Donc ... Je veux montrer le nombre StepDatas.Where (x => x.Completed == true) .Count.

Est-ce possible? Merci pour toute aide!

Répondre

4

La réponse courte à la question du sujet est: non.

La bonne réponse est: Assurez-vous que le Count dont vous avez besoin est une propriété du modèle de données disponible. Par exemple, assurez-vous que le type exposé par StepDatas a une propriété Count.

Cependant, vous qualifiez cela avec "de toute façon possible?". Il est possible de lier au contexte de données ListItem et d'utiliser un convertisseur de valeur pour exécuter votre lambda. Cependant, pour garder les choses simples, vous devez créer un convertisseur spécifiquement pour votre lambda. Voici ce que le code de convertisseur ressemblerait à ceci: -

public class CountCompletedStepDatas : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     YourItemsType item = (YourItemsType)value; 
     return item.StepDatas.Were(x => x.Completed == true).Count().ToString(culture); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 

Vous le faire une instance de ce convertisseur avaiable dans une propriété des ressources dans le XAML, dire de complaisance dans le UserControl: -

<UserControl x:Class="YourNameSpace.ThisControlName" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:YourNameSpace;assembly=YourAssemblyName"> 
    <UserControl.Resources> 
    <local:CountCompletedStepDatas x:Key="Counter" /> 
    </UserContro.Resources> 

maintenant dans votre reliure: -

<TextBlock Text="{Binding Converter={StaticResource Counter} }" ... > 
0

Merci pour la réponse. Après avoir soumis la question, j'ai écrit une classe de conversion pour faire ce que vous avez suggéré, mais j'ai découvert que la propriété count ne provoquera pas de relind lorsque les données changeront. Cela forcera une situation où nous devrons mettre à jour manuellement la liaison lorsque des modifications sont apportées. Obtenir une référence de l'objet image à l'intérieur de la liste pour mettre à jour la cible est malencontreusement une douleur dans le cul! En fin de compte, j'ai simplement ajouté un nouveau champ à la source de données et lié l'image directement à celui-ci comme vous l'avez suggéré. Beaucoup plus propre.

Merci pour les suggestions! Doug

+3

devrait être un commentaire dans la réponse que vous devriez accepter –

Questions connexes