Чтобы иметь менее избыточную разметку XAML, я пытаюсь получить общий элемент выбора типа радиокнопки, то есть я использую ItemsControl
с перечислением как ItemsSource
и создаю шаблон данных, который показывает, какой элемент выбран, проверяя совпадает ли значение перечисления с текущим значением.
Само по себе это невозможно сделать с помощью простого конвертера или DataTrigger, поскольку необходимы две привязки, поэтому я создал общий MutliValueConverter
для проверки на равенство:
<CheckBox.Visibility>
<MultiBinding Converter="{StaticResource EqualityComparisonConv}">
<Binding Path="Key"/>
<Binding Path="DisplayMode_Current" Source="{x:Static local:App.Settings}"/>
</MultiBinding>
</CheckBox.Visibility>
public class EqualityComparisonConverter : IMultiValueConverter
{
#region IMultiValueConverter Members
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2) throw new Exception("At least two inputs are needed for comparison");
bool output = (bool)values.Skip(1).Aggregate(values[0], (x1, x2) => { return x1.Equals(x2); });
return output;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
Очевидная проблема здесь в том, что конвертер возвращает логическое значение, которое мне нужно было бы преобразовать в Visibility
сначала.
Заключение MultiBinding в другую привязку только с помощью конвертера не работает, потому что свойства не являются свойствами зависимостей (следовательно, им не может быть назначена привязка). Я мог бы подумать о нескольких обходных путях, таких как сохранение bool в каком-либо свойстве Tag
, чтобы я мог использовать его как новый источник привязки, но меня больше интересовало бы что-то вроде этого:
<CheckBox.Visibility>
<local:PipeConverter Converter="{StaticResource BooleanToVisibilityConv}">
<MultiBinding Converter="{StaticResource EqualityComparisonConv}">
<Binding Path="Key"/>
<Binding Path="DisplayMode_Current" Source="{x:Static local:App.Settings}"/>
</MultiBinding>
</local:PipeConverter>
</CheckBox.Visibility>
Этот класс должен будет обновлять свои выходные данные, когда происходят изменения в исходной привязке, и он должен иметь возможность выставлять свое выходное значение свойству Visibility
, но я не знаю, как этого добиться. Одна проблема, с которой приходится сталкиваться, заключается в том, что существует необходимость в свойствах зависимостей, поэтому было бы неплохо наследовать от DependencyObject
, но наследование от класса Binding также имело бы смысл, поскольку PipeConverter должен связываться и должен быть установлен как значение другой зависимости свойство.