WPF: иерархия привязки

Я определил привязку по умолчанию в своем стиле.

Например, я настроил привязку видимости моей кнопки так, чтобы она не была видна, если относительная команда не может быть выполнена.

Это мое поведение привязки по умолчанию.

Помимо моего поведения по умолчанию, каждое представление может настроить используемые им кнопки с другой привязкой видимости.

Я хочу объединить две привязки, чтобы, если одна из двух говорит "это не видно", она не была видна!

Другими словами, возможно ли создать иерархию поведения привязки? Спасибо!


person Ricibald    schedule 09.03.2010    source источник


Ответы (2)


Нет, извините, это невозможно в XAML.

Однако вы МОЖЕТЕ сделать эту комбинацию в коде. Для этого вы можете написать BindingConverter.

person TomTom    schedule 09.03.2010

используйте MultiBinding, чтобы связать все различные привязки в XAML и написать собственный IMultiValueConverter, который расставляет приоритеты/и/или распределяет каждое значение по своему усмотрению. Вы не можете использовать MultiBinding без IMultiValueConverter (или StringFormat, но это бесполезно для вас)

Обратите внимание, что PriorityBinding — это НЕ то, что вам здесь нужно.

здесь valueConverter вы можете использовать:

[ValueConversion(typeof(bool), typeof(Visibility))]
public class BooleansAndToVisibilityMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        Func<bool, bool, bool> aggregator = (x, y) => x && y;
        bool aggregate = values.Cast<bool>().Aggregate(aggregator);
        return aggregate ? Visibility.Visible : Visibility.Collapsed;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
person Rob Fonseca-Ensor    schedule 09.03.2010
comment
это хорошее решение, но у меня две привязки рушатся в одном и том же свойстве: видимость, установленная в теме, и видимость, установленная в xaml. - person Ricibald; 22.03.2010