WPF обвързването е разрешено на други контроли, ако списъчно поле има избран елемент

Имам мрежа с 2 колони, списъчно поле в колона 0 и редица други контроли във вторична мрежа в колона 1 на основните мрежи.

Искам тези контроли да бъдат активирани (или може би видими), ако даден елемент е избран в списъчното поле чрез обвързване. Пробвах на комбинирана кутия:

IsEnabled="{Binding myList.SelectedIndex}"

Но това изглежда не работи.

Изпускам ли нещо? Трябва ли нещо подобно да работи?

Благодаря


person Gern Blanston    schedule 01.06.2010    source източник


Отговори (3)


Ще ви трябва ValueConverter за това. Тази статия го описва подробно, но обобщение е, че имате нужда от публичен клас, който имплементира IValueConverter. В метода Convert() можете да направите нещо подобно:

if(!(value is int)) return false;
if(value == -1) return false;
return true;

Сега във вашия XAML трябва да направите:

<Window.Resources>
    <local:YourValueConverter x:Key="MyValueConverter">
</Window.Resources>

И накрая, променете обвързването си на:

IsEnabled="{Binding myList.SelectedIndex, Converter={StaticResource MyValueConverter}"

Сигурен ли си, че не си имал предвид

IsEnabled="{Binding ElementName=myList, Path=SelectedIndex, Converter={StaticResource MyValueConverter}"

все пак? Не можете имплицитно да поставите името на елемента в пътя (освен ако самият Window не е DataContext, предполагам). Може също да е по-лесно да се свържете с SelectedItem и да проверите дали не е нула, но това всъщност е просто предпочитание.

О, и ако не сте запознати с алтернативни xmlns декларации, в горната част на вашия Window добавете

xmlns:local=

и VS ще ви подкани за различните възможности. Трябва да намерите този, който съответства на пространството от имена, в което сте поставили конвертора на стойност, който сте направили.

person JustABill    schedule 01.06.2010

Решение за копиране и поставяне:

Добавете този клас към вашия код:

public class HasSelectedItemConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is int && ((int) value != -1);
    }

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

Добавяне на конвертор като StaticResource към App.xml в раздел <Application.Resources>:

<local:HasSelectedItemConverter x:Key="HasSelectedItemConverter" />

И сега можете да го използвате във вашия XAML:

<Button IsEnabled="{Binding ElementName=listView1, Path=SelectedIndex,
 Converter={StaticResource HasSelectedItemConverter}"/>
person stil    schedule 27.08.2016

Хм, може би работи с BindingConverter, който преобразува изрично всички индекси > 0 в true.

person DHN    schedule 01.06.2010
comment
Индекс 0 обаче е валиден за ListBox. Ще трябва да направите true, ако › -1. - person JustABill; 02.06.2010