0

以下のように条件付きコントロールを書きたいと思います。

<local:ConditionalBlock Condition={Binding CertainBoolValue}>
    <ConditionalBlock.Match>
        <!-- Any content here -->
    </ConditionalBlock.Match>
    <ConditionalBlock.Else>
        <!-- Any content here -->
    </ConditionalBlock.Else>
</local:ConditionalBlock>

現時点では、これをどのように実装すればよいかわかりません。だから助けてください。ありがとう

編集

応答を待っている間、次のようにカスタム コントロールとコントロール テンプレートを使用して独自のソリューションを実装しました。

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

namespace Sample
{
    public class ConditionalControl : ContentControl
    {
        static ConditionalControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ConditionalControl), new FrameworkPropertyMetadata(typeof(ConditionalControl)));
        }

        public object Alternative
        {
            get { return (object)GetValue(AlternativeProperty); }
            set { SetValue(AlternativeProperty, value); }
        }

        public static readonly DependencyProperty AlternativeProperty =
            DependencyProperty.Register("Alternative", typeof(object), typeof(ConditionalControl), new UIPropertyMetadata(null));

        public bool Condition {
            get { return (bool)GetValue(ConditionProperty); }
            set { SetValue(ConditionProperty, value); }
        }

        public static readonly DependencyProperty ConditionProperty =
            DependencyProperty.Register("Condition", typeof(bool), typeof(ConditionalControl), new UIPropertyMetadata(null));
    }
}

条件付きコントロール.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Sample">

    <Style TargetType="{x:Type local:ConditionalControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ConditionalControl}">
                    <Grid>
                        <ContentPresenter Name="match"/>
                        <ContentPresenter Name="alternative" ContentSource="Alternative" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Condition" Value="True">
                            <Setter TargetName="match" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="alternative" Property="Visibility" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="Condition" Value="False">
                            <Setter TargetName="match" Property="Visibility" Value="Collapsed"/>
                            <Setter TargetName="alternative" Property="Visibility" Value="Visible"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

使用例:

<Grid>
    <local:ConditionalControl Condition="{Binding CertainBoolValue}">
        <Label>Match case</Label>
        <local:ConditionalControl.Alternative>
            <Label>Alternative case</Label>
        </local:ConditionalControl.Alternative>
    </local:ConditionalControl>
</Grid>

とにかく、迅速な対応をしてくれた Luke Woodward に感謝します。あなたの回答を承認済みとしてマークします

4

1 に答える 1

1

これを行う 1 つの方法は、次の XAML を使用して UserControl を作成することです。

<ContentControl x:Class="WpfApplication1.ConditionalBlock"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />

および次の分離コード:

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

namespace WpfApplication1
{
    public partial class ConditionalBlock : ContentControl
    {
        public static readonly DependencyProperty ConditionProperty =
            DependencyProperty.Register("Condition", typeof(bool), typeof(ConditionalBlock),
                                        new FrameworkPropertyMetadata(Condition_Changed));

        public ConditionalBlock()
        {
            InitializeComponent();
            Loaded += ((s, e) => UpdateContent());
        }

        public bool Condition
        {
            get { return (bool)GetValue(ConditionProperty); }
            set { SetValue(ConditionProperty, value); }
        }

        public object Match { get; set; }

        public object Else { get; set; }

        private static void Condition_Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            var conditionalBlock = obj as ConditionalBlock;
            if (conditionalBlock != null)
            {
                conditionalBlock.UpdateContent();
            }
        }

        private void UpdateContent()
        {
            Content = (Condition) ? Match : Else;
        }
    }
}

UserControlスーパークラスを からに変更したことに注意してくださいContentControl

これは条件に依存関係プロパティを使用するため、バインドされた値が変更されたときに通知されます。Content条件が変化すると、継承元の依存関係プロパティに割り当てることで、表示されるコンテンツを更新しContentControlます。最後に、コントロールが最初に表示されたときにいずれかのコンテンツが表示されるようにするために、Loadedイベントのハンドラーでコンテンツを更新します。(その時点ではプロパティMatchElseプロパティが設定されていないため、コンストラクタ内から呼び出すことはできません。)

Matchおよびプロパティの内容は変更されないと想定しているElseため、それらを依存関係プロパティとして実装する必要はありません。

于 2012-10-21T17:38:22.037 に答える