Как скрыть кнопку переключения со списком, если есть только один элемент?

У меня есть приложение WPF. В одном окне есть поле со списком.. и я хочу скрыть кнопку переключения и отключить поле со списком, если есть только один элемент.

Как бы я этого добился?

Я пробовал приведенный ниже код для скрытия кнопки переключения. Но не повезло

Любая помощь будет оценена по достоинству. Благодарность

<ComboBox x:Name="CList" ItemsSource="{Binding Path=C}"  >                    
    <Style TargetType="{x:Type ToggleButton}" >
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Items.Count, ElementName=CList}" Value="1">
                <Setter Property="Visibility" Value="Hidden" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ComboBox>

person Relativity    schedule 16.01.2012    source источник


Ответы (3)


Лучшее решение — заменить шаблон поля со списком на шаблон управления (который содержит только текстовый блок), когда количество элементов равно нулю.

Вот xaml для того же.

<ComboBox Name="CList" ItemsSource="{Binding Path=C}" 
                     SelectedItem="{Binding Path=CC}" VerticalAlignment="Center" Margin="0,0,10,0" >
                    <ComboBox.Style>
                        <Style TargetType="{x:Type ComboBox}" >
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=Items.Count, ElementName=CList}" Value="1">
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <TextBlock Text="{Binding Items[0], ElementName=CList}" />
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ComboBox.Style>
                </ComboBox>
person Relativity    schedule 17.01.2012
comment
Я тоже использовал это решение, оно сработало отлично, так что спасибо. Я знаю, что это старый пост, но есть ли способ обновить значение в текстовом поле при изменении одного элемента в списке? - person mobearette; 25.06.2014
comment
Это не работает, если вы уже создали шаблон для своего поля со списком. - person Randall Deetz; 18.12.2015
comment
@RandallDeetz и все, кто уже установил шаблон, могут добавить BasedOn="{StaticResource {x:Type ComboBox}}" к стилю (за TargetType). Это исправило это для меня - person IDarkCoder; 18.10.2018

Вам потребуется изменить Template из ComboBox и реализуйте внутри него триггер. У вас нет доступа к элементам управления в шаблоне извне.

(Вы можете скопировать и изменить существующий шаблон напрямую изменить часть шаблона практически невозможно)

person H.B.    schedule 17.01.2012

Вы также всегда можете использовать конвертер:
(извините, я не до конца прочитал ваш вопрос)

Преобразователи

using System;
using System.Windows;
using System.Windows.Data;
using System.Globalization;

namespace WPFSandbox
{
    public class ComboBoxItemCountToEnabledConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value.GetType() == typeof(Int32))
            {
                if ((int)value > 1)
                    return true;
            }

            return false;
        }

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

    public class ComboBoxItemCountToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value.GetType() == typeof(Int32))
            {
                if ((int)value > 1)
                    return Visibility.Visible;
            }

            return Visibility.Collapsed;
        }

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

XAML

<Window 
... 
...
xmlns:converters="clr-namespace:WPFSandbox">

<Window.Resources>
    <converters:ComboBoxItemCountToVisibilityConverter x:Key="ComboBoxItemCountToVisibilityConverter"/>
    <converters:ComboBoxItemCountToEnabledConverter x:Key="ComboBoxItemCountToEnabledConverter"/>
</Window.Resources>

<StackPanel>
   <ComboBox ItemsSource="{Binding C}" IsEnabled="{Binding Path=C.Count, Converter={StaticResource ComboBoxItemCountToEnabledConverter}}"/>
   <ToggleButton Visibility="{Binding Path=C.Count, Converter={StaticResource ComboBoxItemCountToVisibilityConverter}}"/>
</StackPanel>
person MyKuLLSKI    schedule 17.01.2012
comment
Я хочу полностью скрыть кнопку переключения, а не поле со списком. - person Relativity; 17.01.2012