【问题标题】:Is it possible to bind to a lambda expression in Silverlight?是否可以绑定到 Silverlight 中的 lambda 表达式?
【发布时间】:2010-12-03 09:02:38
【问题描述】:

我有一个简单绑定到集合的列表框。该集合有一个子集合 (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 => x.Completed == true).Count.

这有可能吗?感谢您的帮助!

【问题讨论】:

    标签: silverlight xaml binding lambda


    【解决方案1】:

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

    明智的答案是:确保您需要的 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} }" ... >
    

    【讨论】:

      【解决方案2】:

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

      最终,我只是向数据源添加了一个新字段,并按照您的建议将图像直接绑定到它。干净多了。

      感谢您的建议! 道格

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-19
        • 2014-09-12
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2011-03-19
        相关资源
        最近更新 更多