是否可以绑定到Silverlight中的lambda表达式?

时间:2009-10-02 15:36:09

标签: silverlight xaml binding lambda

我有一个简单地绑定到集合的列表框。该集合有一个子集合(StepDatas)。我想绑定到子集合的计数但使用WHERE语句。我可以绑定到ChildCollection.Count但是在需要添加lambda表达式时会丢失。这是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 =&gt; x.Completed == true).Count。

这有可能吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

主题问题的简短回答是:否。

明智的答案是:确保您所需的Count可用于数据模型的属性。例如,确保StepDatas公开的类型具有Count属性。

但是你确实以“以任何可能的方式”来证明这一点?可以绑定到ListItem数据上下文并使用一些值转换器疯狂来执行lambda。但是为了简单起见,您需要专门为lambda创建一个转换器。 这是转换器代码的样子: -

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

您可以在XAML的Resources属性中创建此转换器的实例,比如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} }" ... >

答案 1 :(得分:0)

感谢您的回复。在提交问题之后,我编写了一个转换器类来执行您最终建议的操作,但发现count属性在数据更改时不会导致重新绑定。这将强制我们必须在进行更改时手动更新绑定。获取列表框内的图像对象的引用以更新目标是不幸的是痛苦的屁股!

最后,我只是在数据源中添加了一个新字段,并将图像直接绑定到它上面。更干净。

感谢您的建议! 道格