# Uncheck Radio Button in WPF
**by:** Nilesh Anchan  **in:** [Programming](https://www.systenics.com/blogs/category/programming/)  **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*WPF*](https://www.systenics.com/blogs/tag/wpf/)
## Introduction

Recently I found myself in need of uncheck my selected Radio Button in WPF (Windows Presentation Framework). Unfortunately Radio Button has an unchecked event but it doesn’t fire. I thought of implementing uncheck onClick event, but even in this case it always gives Checked value true after clicking on Radio Button. I started searching for examples in internet, but didn’t find an appropriate way to achieve this. One way I thought of styling the Checkbox to look like a Radio Button, but doing so is also had few issues. Then I thought of extending the Radio Button and use Dependency Property to achieve the same. This article describes the implementation of the Radio Button that supports uncheck and the way you can use it in your own applications. You can find the full implementation of RadioButtonExtension class in the attached demo.

## Using the Code

Create a new WPF application in Visual Studio 2012. Then add a new class in your project and give a name as RadioButtonExtension. Inherit the class with RadioButton object so that we can extend its events. Now in the constructor of RadioButtonExtension class initialize the events of radio buttons as shown Listing 1 below:

Listing 1 - RadioButtonExtension.cs – modified constructor and events

```
public class RadioButtonExtension : RadioButton
{
public RadioButtonExtension()
{
this.Checked += RadioButtonExtension_Checked;
this.Click += RadioButtonExtension_Click;
}

void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
}

void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{

}
}
```

Now create a Dependency Property in **RadioButtonExtension.cs**in order to change the checked property of Radio Button as follows:

Listing 2 – Dependency Property

```
public bool? IsCheckedChanged
{
get { return (bool?)GetValue(IsCheckedChangedProperty); }
set { SetValue(IsCheckedChangedProperty, value); }
}

// Using a DependencyProperty as the backing store for IsChanged.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckedChangedProperty =
DependencyProperty.Register("IsChanged", typeof(bool?),
typeof(RadioButtonExtension),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
CheckedChanged));

public static void CheckedChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
}
```

Lastly create a static int property, **WasChecked** which will help us to know the previous status of Checkbox. I update the value of the**WasChecked** property in the **Click** and**Checked** event. I also update the dependency property**IsCheckedChanged** which will call**CheckedChanged** method on property change and assign the**Checked** value of Radio Button with the new value as shown in listing 3 below.

Listing 3 - Modifying **WasChecked** property and**IsCheckedChanged** dependency property

```
public static int WasChecked { get; set; }

void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (WasChecked > 0)
{
this.IsCheckedChanged = !this.IsCheckedChanged;
}
WasChecked = 1;
}

void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{
this.IsCheckedChanged = true;
WasChecked = 0;
}
```

The way this works is that when RadioButton is checked, the**Checked** event is fired which sets**WasChecked** = 0 and **IsCheckedChanged**=true. Then **Click** event is fired where I set**WasChecked** = 1.
Similarly, when the RadioButton is clicked again it fires the **Click** event in which case it checks**WasChecked** > 0, so it sets the dependency property **IsCheckedChanged** = false. Which fires the event**CheckedChanged** which assigns the new value to the RadioButton.

The full source code of the **RadioButtonExtension** class is shown in listing 4 below:

Listing 4 – Full **RadioButtonExtension** class source code

```
using System.Windows;
using System.Windows.Controls;

namespace RadioButtonSam
{
public class RadioButtonExtension : RadioButton
{
public static int WasChecked { get; set; }

public bool? IsCheckedChanged
{
get { return (bool?)GetValue(IsCheckedChangedProperty); }
set { SetValue(IsCheckedChangedProperty, value); }
}

// Using a DependencyProperty as the backing store for IsChanged.
//This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckedChangedProperty =
DependencyProperty.Register("IsChanged", typeof(bool?),
typeof(RadioButtonExtension),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
CheckedChanged));

public static void CheckedChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
}

public RadioButtonExtension()
{
this.Checked += new RoutedEventHandler(RadioButtonExtension_Checked);
this.Click += RadioButtonExtension_Click;
}

void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (WasChecked > 0)
{
this.IsCheckedChanged = !this.IsCheckedChanged;
}
WasChecked = 1;
}

void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{
this.IsCheckedChanged = true;
WasChecked = 0;
}
}
}
```

To use this new **RadioButtonExtension** in your project, you can include it in your **MainWindow.xaml** as shown in listing 5 below:

Listing 5 – Using **RadioButtonExtension** in**MainWindow.xaml**

```
<Window x:Class="RadioButtonSam.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:controls="clr-namespace:RadioButtonSam">
<StackPanel>
<RadioButton x:Name="rdMyRadio" Checked="rdMyRadio_Checked_1" Unchecked="rdMyRadio_Unchecked_1"
Content="My Radio Button" />
<controls:RadioButtonExtension Content="My Custom Radio Button"
GroupName="GR1" />
<controls:RadioButtonExtension Content="My 2nd Custom Radio Button"
GroupName="GR1" />
<controls:RadioButtonExtension Content="My 3rd Custom Radio Button"
GroupName="GR2" />
</StackPanel>
</Window>
```

Hope that this would help you in your projects which help me a lot.

[Click here](https://www.systenics.com/media/3922/RadioButtonSam.zip) to download the source file.

## Need help implementing this for your business?

Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.

[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).