Можно ли привязать к лямбда-выражению в Silverlight? - PullRequest
2 голосов
/ 02 октября 2009

У меня есть список, который просто привязывается к коллекции. Коллекция имеет дочернюю коллекцию (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 ]

4 голосов
/ 02 октября 2009

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

Разумный ответ: убедитесь, что 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} }" ... >
0 голосов
/ 05 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...