Прежде всего, ControlA и ControlB должны иметь свойство зависимости для IsSet
.
public bool IsSet
{
get { return (bool)GetValue(IsSetProperty); }
set { SetValue(IsSetProperty, value); }
}
public static readonly DependencyProperty IsSetProperty =
DependencyProperty.Register(
"IsSet",
typeof(bool),
typeof(ControlA), //Change in ControlB
new PropertyMetadata(false, OnIsSetPropertyChanged));
private static void OnIsSetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Control source = d as Control;
string newState = (bool)e.NewValue ? "StateOn" : "StateOff";
VisualStateManager.GotoState(source, newState, true);
}
Вопреки вашей интуиции визуальные состояния вообще не распространяются. Состояния имеют значение только для контроля, к которому они непосредственно привязаны. Однако с помощью этого свойства зависимости, добавленного к обоим элементам управления, теперь вы можете распространять значение свойства через привязку шаблона: -
<ControlTemplate x:Name="templateB" TargetType="Control">
<local:ControlB Template="{StaticResource templateA}" IsSet="{TemplateBinding IsSet}" />
</ControlTemplate>
Что касается вашего исходного кода ControlA, поле m_isSet
больше не требуется: -
public void ToggleState()
{
IsSet = !IsSet;
}