我根据this链接上的“繁重选项”进行了以下自定义控制:
public partial class SelectableContentControl : ContentControl
{
public SelectableContentControl()
{
InitializeComponent();
var isCheckedDesc = DependencyPropertyDescriptor.FromProperty(IsCheckedProperty, typeof(SelectableContentControl));
isCheckedDesc.AddValueChanged(this, IsCheckedPropertyChanged);
}
public bool IsChecked
{
get { return (bool)GetValue(IsCheckedProperty); }
set { SetValue(IsCheckedProperty, value); }
}
public static readonly DependencyProperty IsCheckedProperty =
DependencyProperty.Register("IsChecked", typeof(bool),
typeof(SelectableContentControl), new PropertyMetadata(false));
private void IsCheckedPropertyChanged(object sender, EventArgs e)
{
var selectable = Content as IAmSelectable;
if (selectable != null) selectable.IsSelected = IsChecked;
}
}
为SelectableContentControl
定义的样式如下:
<Style TargetType="{x:Type controls1:SelectableContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}">
<CheckBox IsChecked="{TemplateBinding IsChecked}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
......和我的用法:
<controls:SelectableContentControl Grid.Row="2" Content="{Binding Dummy}" IsChecked="{Binding Dummy.IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
每当IsCheckedPropertyChanged
值在UI上发生更改时,我都希望调用IsChecked
,但这不会发生。有人看到我错过的东西吗?
答案 0 :(得分:5)
TemplateBinding
以OneWay
模式运行,这意味着该值仅在源到目标方向上更新(您的控件是源,而模板内的CheckBox
是目标)。如果您希望绑定在TwoWay
模式下工作,则应使用普通Binding
代替:
<ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}">
<CheckBox IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}}" />
</ControlTemplate>
请注意,您不需要在绑定上指定Mode=TwoWay
,因为默认情况下CheckBox.IsChecked
属性以双向模式绑定。
有关详细信息,请参阅this question。