Привязка WPF IsEnabled к другим элементам управления, если в списке есть элемент выбора

У меня есть сетка с 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