Я пытаюсь связать свойство IsChecked
ToggleButton
через расширение разметки, которое разрешается до MultiBinding
. В XAML у меня есть две кнопки переключения источника и кнопка переключения цели, для которой IsChecked
должно быть привязано к IsChecked
кнопок источника.
<ToggleButton x:Name="Source1" Content="Source 1" Margin="5" Padding="5,2"/>
<ToggleButton x:Name="Source2" Content="Source 2" Margin="5" Padding="5,2"/>
<ToggleButton Content="Target" Margin="5" Padding="5,2">
<ToggleButton.IsChecked>
<local:ExMultiBinding Converter="{StaticResource AnyConverter}">
<Binding ElementName="Source1" Path="IsChecked"/>
<Binding ElementName="Source2" Path="IsChecked"/>
</local:ExMultiBinding>
</ToggleButton.IsChecked>
</ToggleButton>
Мое расширение разметки, обеспечивающее MultiBinding
, выглядит следующим образом: this
[ContentProperty("Bindings")]
public class ExMultiBindingExtension : MarkupExtension, INotifyPropertyChanged
{
public Collection<BindingBase> Bindings { get; set; } = new Collection<BindingBase>();
public IMultiValueConverter Converter { get; set; }
public BindingMode Mode { get; set; }
public UpdateSourceTrigger UpdateSourceTrigger { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var multi = new MultiBinding
{
Converter = Converter,
Mode = Mode,
UpdateSourceTrigger = UpdateSourceTrigger
};
return multi;
}
public event PropertyChangedEventHandler PropertyChanged;
}
При запуске пользовательского интерфейса выдает
ArgumentException: 'System.Windows.Data.MultiBinding' is not a valid value for property 'IsChecked'.
Я проверил, а свойство IsChecked
в реализации ToggleButton
фактически не помечено
[Bindable(true)]
но только с
[Category("Appearance")]
[TypeConverter(typeof (NullableBoolConverter))]
[Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]
Работает прямая привязка через Binding
или MultiBinding
в XAML.
Пример кода упрощен для освещения проблемы. невозможно избежать MarkupExtension в реальном коде, так как реализация более сложная.