[英]WPF ToggleButton multibinding of IsChecked through MarkupExtension throws
我正在嘗試通過解析為MultiBinding
的標記擴展來綁定ToggleButton
的IsChecked
屬性。 在 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 中的Binding
或MultiBinding
直接綁定有效。
示例代碼被簡化以突出問題。 由於實現更復雜,因此無法避免實際代碼中的 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.