Заменить текстовое значение на одном элементе ComboBox с помощью триггеров - PullRequest
0 голосов
/ 04 октября 2018

Я использую элемент управления ComboBox для установки целочисленного значения адреса физического устройства.ComboBox ItemSource связан со списком целых чисел, где первое значение «-1» указывает, что устройство не подключено.

Я бы хотел, чтобы значение «-1» отображалось как «NONE».Можно ли это сделать с помощью триггеров, чтобы он заменял текст в раскрывающемся списке и в самом ComboBox, если он был выбран?Я подумываю об использовании enums и атрибута Description, но я надеялся, что мне не нужно идти по этому пути.

Пример:

enter image description here

XAML:

<ComboBox Height="30"
          ItemsSource="{Binding Path=AddressSelection}"
          SelectedItem="{Binding Path=SelectedAddress}" />

Код:

public class MainWindowVM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public List<int> AddressSelection
    {
        get { return new List<int>() { -1, 1, 2, 3, 4 }; }
    }

    private int _selectedAddress;
    public int SelectedAddress
    {
        get { return _selectedAddress; }
        set
        {
            SetNotify(ref _selectedAddress, value);
            Console.WriteLine("Selected address is {0}", value);
        }
    }

    public void SetNotify<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        storage = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Краткий ответ: Да.Вы должны быть в состоянии сделать это в чистом XAML:

<ComboBox Height="30"
          ItemsSource="{Binding Path=AddressSelection}"
          SelectedItem="{Binding Path=SelectedAddress}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Text" Value="{Binding}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding}" Value="-1">
                                <Setter Property="Text" Value="NONE" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
0 голосов
/ 04 октября 2018

Использование ValueConverter в ComboBox ItemTemplate решило это для меня.

XAML:

<Window.Resources>
    <local:ValueConverter x:Key="ValueConverter" />
</Window.Resources>
<ComboBox Height="30"
          ItemsSource="{Binding Path=AddressSelection}"
          SelectedItem="{Binding Path=SelectedAddress}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ., Converter={StaticResource ValueConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Конвертер:

public class ValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((int)value != -1)
        {
            return ((int)value).ToString();
        }
        else
        {
            return "NONE";
        }
    }

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...