WPF ToggleButton мультисвязывание IsChecked через броски MarkupExtension - PullRequest
0 голосов
/ 24 апреля 2020

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

1 Ответ

0 голосов
/ 24 апреля 2020

BindingBase само по себе является MarkupExtension. И, конечно, markupExtension не относится к типу bool и не может быть назначен члену типа bool.

. Причина, по которой ваше расширение вызывается, заключается в том, что синтаксический анализатор XAML хочет разрешить каждый MarkupExtension. Это делается путем вызова метода MarkupExtension.ProvideValue. В этом случае объект BindingBase будет связан с объектом BindingExpressionBase. Это BindingExpressionBase разрешит базовую привязку для возврата фактического значения (упрощенно).

Таким образом, необходимо вручную разрешить разметку BindingBase:

public override object ProvideValue(IServiceProvider serviceProvider)
{
  var multi = new MultiBinding
  {
    Converter = Converter,
    Mode = Mode,
    UpdateSourceTrigger = UpdateSourceTrigger
  };

  // Resolve the MarkupExtension BindingBase
  return multi.ProvideValue(serviceProvider);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...