Search code examples
silverlightxamlcontroltemplatecontentpresentervisualstates

Silverlight Change Content Based on Control CheckState (Toggle multiple ContentPresenters)


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>

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