2009-10-02 7 views
2

단순히 컬렉션에 바인딩하는 목록 상자가 있습니다. 컬렉션에는 하위 컬렉션 (StepDatas)이 있습니다. 하위 컬렉션의 수에 바인딩하고 싶지만 WHERE 문을 사용하고 싶습니다. ChildCollection.Count에 바인딩 할 수 있지만 람다 식을 추가해야 할 때 손실됩니다. 여기 XAML는 다음과 같습니다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> 

은 위의 하위 집합의 개수에 결합하기 위해 노력하고 있습니다. 그러나 특정 조건이 충족되는 경우 하위 컬렉션 수를 표시하려고합니다. 이 특정 경우 하위 컬렉션에는 완료된 속성 (bool)이 있습니다. 그래서 ... CountDatas.Where (x => x.Completed == true) .Count를 보여주고 싶습니다.

어떤 방식 으로든 가능합니까? 어떤 도움을 주셔서 감사합니다!

답변

4

주제 질문에 대한 짧은 대답은 다음과 같습니다.

필요한 답변은 다음과 같습니다. Count이 데이터 모델의 속성으로 사용 가능하게 설정되어 있는지 확인하십시오. 예를 들어 StepDatas에 의해 노출 된 유형이 Count 속성을 갖고 있는지 확인하십시오.

그러나 "어떤 방법 으로든 가능합니까?"라고 적격합니까? ListItem 데이터 컨텍스트에 바인딩하고 람다를 실행하기 위해 일부 값 변환기 광기를 사용하는 것이 가능합니다. 그러나 일을 단순하게 유지하려면 람다 전용 변환기를 만들어야합니다. 여기 같이 컨버터 코드가 보일 것이다 것입니다 : - 당신이 (가) XAML의 자원 속성에 avaiable이다이 변환기의 인스턴스를 만들 것

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

, 해당 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

감사합니다. 질문을 제출 한 후, 나는 당신이 제안한 것을 끝내기 위해 변환기 클래스를 작성했지만 데이터가 변경 될 때 count 속성이 리 바인드를 일으키지 않음을 발견했다. 이렇게하면 변경 사항을 적용 할 때 바인딩을 수동으로 업데이트해야하는 상황이 발생합니다. 대상을 업데이트하기 위해 목록 상자 안에 이미지 객체의 참조를 가져 오는 것은 엉뚱한 일이지만 엉덩이에 고통이 있습니다!

궁극적으로, 필자는 데이터 소스에 새 필드를 추가하고 사용자가 제안한 것처럼 이미지를 직접 바인딩했습니다. 훨씬 더 청결한.

제안 해 주셔서 감사합니다. Doug

+3

당신이 받아 들여야하는 대답의 코멘트 여야합니다. –

관련 문제