Можно ли привязать к лямбда-выражению в Silverlight?

У меня есть список, который просто привязывается к коллекции. Коллекция имеет дочернюю коллекцию (StepDatas). Я хотел бы привязать к количеству дочерней коллекции, но с оператором WHERE. Я могу привязаться к ChildCollection.Count, но теряюсь при необходимости добавить лямбда-выражение. Вот XAML:

<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>

Вышеприведенное работает для привязки к количеству дочерней коллекции. Однако я хочу показать количество дочерней коллекции, где выполняется определенное условие. В этом конкретном случае дочерняя коллекция имеет завершенное свойство (bool). Итак... Я хочу показать количество StepDatas.Where(x => x.Completed == true).Count.

Это каким-либо образом возможно? Спасибо за любую помощь!

2 ответа

Краткий ответ на предметный вопрос: нет.

Разумный ответ: обеспечить Count вам нужно сделать доступным свойство модели данных. Например, убедитесь, что StepDatas имеет Count имущество.

Однако вы квалифицируете это как "каким-либо образом возможно?". Можно выполнить привязку к контексту данных ListItem и использовать какое-то безумие конвертера значений для выполнения вашей лямбды. Однако для простоты вам нужно создать конвертер специально для вашей лямбды. Вот как будет выглядеть код конвертера:

 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();
    }
  }

Вы бы сделали экземпляр этого конвертера доступным в свойстве Resources в XAML, скажем для удобства в 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>

Теперь в вашем обязательном порядке: -

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

Спасибо за ответ. После отправки вопроса я написал класс конвертера, чтобы сделать то, что вы в итоге предложили, но обнаружил, что свойство count не будет вызывать повторное связывание при изменении данных. Это создаст ситуацию, когда нам придется вручную обновлять привязку при внесении изменений. Получение ссылки на объект изображения внутри списка для обновления цели, к счастью, является болью в заднице!

В конце концов, я просто добавил новое поле в источник данных и привязал изображение непосредственно к нему, как вы предложили. Гораздо чище.

Спасибо за предложения! Doug

Другие вопросы по тегам