Question

I would like to change the content of a control based on its current CheckState (checked, unchecked, indeterminate). If possible I would like the solution to use only XAML and require no code behind.

I am wondering which control to use and how to define the multiple sets of content.

Example: A "ToggleContent" control that displays UserControl1 when the checked state is Unchecked and UserControl2 when the checked state is Checked.

The XAML might look something like this:

        <ToggleContent>
            <ToggleContent.ContentUnchecked>
                <local:UserControl1></local:UserControl1>
            </ToggleContent.ContentUnchecked>
            <ToggleContent.ContentChecked>
                <local:UserControl2></local:UserControl2>
            </ToggleContent.ContentChecked>
        </ToggleContent>
Was it helpful?

Solution

I'm not sure what "no code behind" means, but this sounds like a perfect example for using a ValueConverter and changing visibility based on the check state. It would look something like this:

<StackPanel>
    <CheckBox x:Name="MyCheckBox"/>
    <local:UserControl1 Visibility="{Binding IsChecked, ElementName=MyCheckBox, Converter={StaticResource BoolToVis}, ConverterParameter=False">
    <local:UserControl2 Visibility="{Binding IsChecked, ElementName=MyCheckBox, Converter={StaticResource BoolToVis}, ConverterParameter=True">

The Converter:

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return Visibility.Collapsed;

        bool comparer = true;
        if(parameter != null)
        {
            comparer = System.Convert.ToBoolean(parameter);
        }
        return System.Convert.ToBoolean(value) == comparer ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Here's a nice post from Jeff Wilcox on value converters

OTHER TIPS

You can create a style to CheckBox or ToggleButton, replace the ContentPresenter inside the style by your UserControls and change them visibility in the CheckStates.

id create a user control based on the checkbox and use the visualstatemanager to load your controls.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top