简体   繁体   中英

Visibility against the collection of items in WPF

I have dropdown and Grid. in the grid column there is hyperlink.If the Dropdown collection contains 1 item then the dropdown should be invisible.I meean need a logic to bind Visibility against the collection of items.

Here is the XAML for one Hyperlink in the GRid.

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

You could bind visibility to the HasItems property and use BooleanToVisibilityConverter

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

or do something like this or this

  1. IsVisible is not a property of TextBlock, you need to use Visibility property;
  2. RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DPA2:TakenCoursesNotApplied}}" - You can't use FindAncestor statement unless your DPA2:TakenCoursesNotApplied type is control that is in visual tree above your TextBlock.

Perhaps you need some value converter that accepts count of elements in your collection and returns Visibility.Collapsed if count == 1.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM