【发布时间】:2020-04-24 09:13:39
【问题描述】:
我正在尝试通过解析为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,因为实现更加复杂。
【问题讨论】:
-
你见过this吗?您可以尝试从 MultiBinding 而不是 MarkupExtension 派生。
标签: wpf data-binding togglebutton markup-extensions