2012-12-04 3 views
0

드롭 다운과 그리드가 있습니다. 그리드 열에 하이퍼 링크가 있습니다. 드롭 다운 컬렉션에 항목이 하나있는 경우 드롭 다운이 보이지 않아야합니다. 항목 컬렉션에 대한 가시성을 바인딩하는 논리가 필요합니다.WPF의 항목 컬렉션에 대한 가시성

다음은 GRid의 하이퍼 링크 하나에 대한 XAML입니다.

<!--Associate--> 
        <TextBlock Margin="10, 0, 0, 0">          
         <TextBlock.Visibility>           
           <MultiBinding Converter="{StaticResource courseListVisibilityConverter}" 
                ConverterParameter="Associate"> 
              <Binding Path="IsCourseAssocited" 
                RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DPA2:TakenCoursesNotApplied}}" /> 
              <Binding Path="DataContext" 
                RelativeSource="{RelativeSource Self}" /> 
             </MultiBinding> 
          </TextBlock.Visibility> 

         <Hyperlink DataContext="{Binding}" 
            Name="Associate" 
            IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBlock}}, Path=IsVisible}" 
            Click="Associate_Click"> 
          <TextBlock TextWrapping="Wrap" 
             Text="Associate" /> 
         </Hyperlink> 
        </TextBlock> 

public class CourseListVisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null || value[0] == null || value[1] == null) return Visibility.Collapsed; 
     bool IsEditMode = value[0] == DependencyProperty.UnsetValue ? false : (bool)value[0]; 

     if (value[1].GetType() == typeof(Course)) 
     { 
      Course course = value[1] as Course; 
      if (course == null) return string.Empty; 

      //Visibility retVal = Visibility.Visible; 
      switch (parameter.ToString()) 
      { 
       case "CodeLink": 
        if (!IsEditMode) return Visibility.Collapsed; 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (course.IsInElectivePool && 
         course.IsManualAdd) return Visibility.Visible; 
        if (!course.IsInElectivePool && 
          !course.IsWaived) return Visibility.Visible; 

        if (course.IsInElectivePool && 
         course.FulFillmentId != 0 && 
         course.FulFillmentId != -1 && 
         !course.IsWaived) return Visibility.Visible; 

        return Visibility.Collapsed; 

       case "CodeNoLink": 
        if (!IsEditMode) return Visibility.Visible; 
        if (course.HideOptions) return Visibility.Visible; 

        if (course.IsInElectivePool && 
         course.IsManualAdd) return Visibility.Collapsed; 
        if (!course.IsInElectivePool && 
          !course.IsWaived) return Visibility.Collapsed; 

        if (course.IsInElectivePool && 
         course.FulFillmentId != 0 && 
         course.FulFillmentId != -1 && 
         !course.IsWaived) return Visibility.Collapsed; 

        return Visibility.Visible; 

       case "Waive": 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (IsEditMode && 
         !course.IsWaived && 
         !(course.RetakenFlag == RetakeFlagType.RetakeOfCourse) && 
         !course.IsInElectivePool) return Visibility.Visible; 
        return Visibility.Collapsed; 

       case "UndoWaive": 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (IsEditMode && course.IsWaived && 
          !(course.RetakenFlag == RetakeFlagType.RetakeOfCourse) && 
         !course.IsInElectivePool) return Visibility.Visible; 
        return Visibility.Collapsed; 

       case "UndoAdd": 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (IsEditMode && course.IsManualAdd && 
         (!(course.RetakenFlag == RetakeFlagType.RetakeOfCourse) && 
         !course.IsInElectivePool)) return Visibility.Visible; 
        return Visibility.Collapsed; 
       case "Associate": 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (IsEditMode && course.IsCourseAssocited) 
         return Visibility.Collapsed; 
        else if (IsEditMode && 
         ((course.Status.ToUpper() == "COMPLETE" || course.Status.ToUpper() == "DROPPED"))) 
        { 
         return Visibility.Visible; 
        } 
        else 
        { 
         return Visibility.Collapsed; 
        } 
       //case "UnAssociate": 
       // if (course.HideOptions) return Visibility.Collapsed; 
       // if (IsEditMode && (course.IsCourseAssocited)) 

       // { 
       //  return Visibility.Visible; 
       // } 
       // else 
       // { 
       //  return Visibility.Collapsed; 
       // } 
       case "FullFillRequirement": 
        if (course.HideOptions) return Visibility.Collapsed; 
        if (IsEditMode && 
         ((course.Status.ToUpper() == "FUTURE"))) 
        { 
         return Visibility.Visible; 
        } 
        else 
        { 
         return Visibility.Collapsed; 
        } 
       default: 
        return Visibility.Collapsed; 
      } 
     } 
     else if (value[1].GetType() == typeof(ElectivePool)) 
     { 
      ElectivePool electivePool = value[1] as ElectivePool; 
      if (electivePool == null) return string.Empty; 

      switch (parameter.ToString()) 
      { 
       case "Waive": 

        if (IsEditMode && 
         !electivePool.IsWaived) return Visibility.Visible; 
        return Visibility.Collapsed; 

       case "UndoWaive": 
        if (IsEditMode && 
         electivePool.IsWaived) return Visibility.Visible; 
        return Visibility.Collapsed; 
      } 
     } 
     return Visibility.Visible; 
    } 

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

답변

1
  1. 에서 IsVisible가있는 TextBlock의 속성이 아닙니다, 당신은 Visibility 속성을 사용합니다;
  2. RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DPA2:TakenCoursesNotApplied}}" - DPA2:TakenCoursesNotApplied 유형이 TextBlock 위에 시각적 트리에있는 컨트롤이 아닌 한 FindAncestor 문을 사용할 수 없습니다.

은 아마 당신은 컬렉션에있는 요소의 수를 수용하고 카운트 == 1.

+0

, 컨버터의 프레젠테이션 모델에있는 컬렉션을 사용할 수 있습니까? – KCS

+0

2. PresentationModel에서 변환기에있는 속성을 사용할 수 있습니다. 모델에서 컬렉션 수를 확인하고 boolena 속성을 업데이트합니다. Converter calss에서 동일한 속성을 사용할 수 있습니까? – KCS

+0

예, 부울 속성을 [BooleanToVisibilityConverter] (http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx)와 함께 사용할 수 있지만 PropertyChanged 알림을 사용하는 것을 잊지 마십시오. [Here] (http://msdn.microsoft.com/en-us/library/ms743695.aspx) 예제입니다. – EugenSoft

5

당신은 HasItems 속성에 대한 가시성을 결합하여 사용할 수있는 경우 Visibility.Collapsed 반환 일부 값 변환기를 필요 BooleanToVisibilityConverter

Visibility="{Binding HasItems,ElementName=ELementName,Converter={StaticResource BooleanToVisibilityConverter}" 

or do something like this 또는 this

+0

이것은 매력처럼 작동하지만, 단지 목록에서 항목을 제거하면 즉시 textBlock의 가시성이 다시 보일 것입니다. – Debhere

관련 문제