WPF bind IsEnabled для других элементов управления, если в списке есть элемент select - PullRequest
2 голосов
/ 02 июня 2010

У меня есть сетка с 2 столбцами, списком в столбце 0 и рядом других элементов управления во вторичной сетке в столбце 1 основных сеток.

Я хочу, чтобы эти элементы управления были включены (или, возможно, видимы), только если элементы выбраны в списке посредством привязки. Я попробовал на поле со списком:

IsEnabled="{Binding myList.SelectedIndex}"

Но, похоже, это не сработает.

Я что-то упустил? Должно ли что-то подобное работать?

спасибо

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Вам понадобится 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 подскажет вам различные возможности. Вам нужно найти тот, который соответствует пространству имен, в которое вы поместили конвертер значений, в который вы сделали.

0 голосов
/ 27 августа 2016

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

Добавьте этот класс к вашему коду:

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}"/>
0 голосов
/ 02 июня 2010

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

...