I would create a behavior. The following is an example of a behavior:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace Medtronic.NIM4.UI.Common.Converters
{
public class ResetRadioButtonOnVisibilityBehavior
{
public static bool GetEnable(DependencyObject obj)
{
return (bool)obj.GetValue(EnableProperty);
}
public static void SetEnable(DependencyObject obj, bool value)
{
obj.SetValue(EnableProperty, value);
}
public static readonly DependencyProperty EnableProperty =
DependencyProperty.RegisterAttached("Enable",
typeof(bool), typeof(ResetRadioButtonOnVisibilityBehavior),
new UIPropertyMetadata(OnEnablePropertyChanged));
private static void OnEnablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = (FrameworkElement) d;
if ((bool)e.NewValue)
element.IsVisibleChanged += ElementOnIsVisibleChanged;
else
element.IsVisibleChanged -= ElementOnIsVisibleChanged;
}
private static void ElementOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var dependencyObject = (UIElement)sender;
if (!(bool) dependencyPropertyChangedEventArgs.NewValue)
{
var checkBoxes = FindVisualChildren<ToggleButton>(dependencyObject).ToList();
checkBoxes.ForEach(i => i.IsChecked = false);
}
}
#region private static
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject root) where T : DependencyObject
{
if (root != null)
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(root, i);
if (child is T) yield return (T)child;
foreach (T childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
#endregion
}
}
Here is how you would use this behavior:
<Border converters:ResetRadioButtonOnVisibilityBehavior.Enable="True"
Style="{StaticResource SettingsSideBorder}">