【问题标题】:Silverlight Change Content Based on Control CheckState (Toggle multiple ContentPresenters)Silverlight 基于控件 CheckState 更改内容(切换多个 ContentPresenters)
【发布时间】:2012-03-10 03:03:32
【问题描述】:

我想根据当前的 CheckState(选中、未选中、不确定)更改控件的内容。如果可能的话,我希望解决方案只使用 XAML 并且不需要任何代码。

我想知道使用哪个控件以及如何定义多组内容。

示例:选中检查状态时检查状态并在选中检查状态时显示userControl1的“ togglecontent”控件。

XAML 可能如下所示:

        <ToggleContent>
            <ToggleContent.ContentUnchecked>
                <local:UserControl1></local:UserControl1>
            </ToggleContent.ContentUnchecked>
            <ToggleContent.ContentChecked>
                <local:UserControl2></local:UserControl2>
            </ToggleContent.ContentChecked>
        </ToggleContent>

【问题讨论】:

    标签: silverlight xaml controltemplate contentpresenter visualstates


    【解决方案1】:

    我不确定“没有代码背后”是什么意思,但这听起来像是使用 ValueConverter 并根据检查状态更改可见性的完美示例。 它看起来像这样:

    <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">
    

    转换器:

    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();
        }
    }
    

    这是一个不错的 post from Jeff Wilcox 价值转换器

    【讨论】:

    • 我希望此功能由内置控件提供,但此解决方案将起作用。谢谢。
    【解决方案2】:

    您可以创建CheckBoxToggleButton 的样式,将样式内的ContentPresenter 替换为您的UserControl,并在CheckStates 中更改它们的可见性。

    【讨论】:

    • 只有一个ContentPresenter,如何指定两个不同的ContentTemplates?
    • 用您的自定义控件替换 ContentPresenter 并且不要创建 ContentTemplate。这将是您的自定义样式。
    • 谢谢。如果您需要为每个切换按钮/复选框显示相同的两件事,则此解决方案将起作用,但如果您希望内容随着应用程序内的不同用途而改变,则不能。这需要为每个实例使用不同的样式。
    【解决方案3】:

    id 根据复选框创建一个用户控件,并使用 visualstatemanager 加载您的控件。

    【讨论】: