簡體   English   中英

WPF 通過 MarkupExtension 拋出 IsChecked 的 ToggleButton 多重綁定

[英]WPF ToggleButton multibinding of IsChecked through MarkupExtension throws

我正在嘗試通過解析為MultiBinding的標記擴展來綁定ToggleButtonIsChecked屬性。 在 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的標記擴展看起來像這樣

[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;
}

啟動 UI 產生

ArgumentException: 'System.Windows.Data.MultiBinding' is not a valid value for property 'IsChecked'.

我檢查了ToggleButton實現上的IsChecked屬性實際上沒有標記

[Bindable(true)]

但只有與

[Category("Appearance")]
[TypeConverter(typeof (NullableBoolConverter))]
[Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]

通過 XAML 中的BindingMultiBinding直接綁定有效。

示例代碼被簡化以突出問題。 由於實現更復雜,因此無法避免實際代碼中的 MarkupExtension

BindingBase本身就是一個MarkupExtension 當然, markupExtension不是bool類型,也不能分配給bool類型的成員。

調用您的擴展的原因是因為 XAML 解析器想要解析每個MarkupExtension 這是通過調用MarkupExtension.ProvideValue方法來完成的。 在這種情況下, BindingBase object 將與BindingExpressionBase object 相關聯。 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM