0

ラベル内にあるコントロールをWPFで作成しており、ラベルの可視性プロパティを変更するために依存関係プロパティを作成しました。

私の問題は、依存関係プロパティが割り当てられると同時に、ラベルの可視性プロパティを変更する方法が見つからないことです。

私のコードは以下の通りです:

public static readonly DependencyProperty captionVisibleProperty = DependencyProperty.Register(
                                                                            "CaptionVisible",
                                                                            typeof(bool),
                                                                            typeof(MyCustomControl));

    public bool CaptionVisible
    {
        get
        {
            return (bool)GetValue(captionVisibleProperty);
        }
        set
        {
            SetValue(captionVisibleProperty, value);
            ShowCaption();
        }
    }

    private void ShowCaption()
    {
        if (CaptionVisible)
        {
            captionLabel.Visibility = System.Windows.Visibility.Visible;
        }
        else
        {
            captionLabel.Visibility = System.Windows.Visibility.Collapsed;
        }
    }

ご覧のとおり、プロパティが設定されているときにShowCaption()メソッドを呼び出そうとしましたが、何も起こりません。

それで、それを成し遂げるために私は何をすべきでしょうか?

誰かが私を助けてくれることを願っています。前もって感謝します。

4

2 に答える 2

1

ShowCaption()必要ないはずです。代わりに、xaml でラベルのVisibilityプロパティを自分のプロパティにバインドするだけCaptionVisibleです。また、コードを整理するために、 Model-View-ViewModel設計パターンに従うことをお勧めします。これは、ユーザー インターフェイス (ビュー) を制御するためのロジックを個別の ViewModel クラスに配置し、ViewModel をそのビューのDataContextプロパティに割り当てることを意味します。

これにより、バインディングがはるかに簡単になります。ユーザー インターフェイス要素に属するプロパティの参照は、WPF では少し面倒な場合があります。規約により、WPF のバインディング システムは、ユーザー インターフェイス要素のコンテンツを簡単に取得できるように特別に設計されていますDataContext

また、プロパティの型が ではないBooleanToVisiblityConverterため、バインディングを機能させるために便利なダンディを使用する必要があります。簡単にアクセスできるように、ウィンドウ (またはコントロール) のリソース ディクショナリに配置するのが好きです。Visibilitybool

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>


<Label Visibility="{Binding Path=CaptionVisible, 
                            Converter={StaticResource BooleanToVisibilityConverter}}"> 
    <!-- label content -->
</Label>

補足として、CaptionVisible がバインドのターゲットにならない限り、それを依存関係プロパティにするのはやり過ぎです。このバインディングではソースにすぎないため、実装INotifyPropertyChangedするだけで十分です。

class MyViewModel : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool _captionVisible;
    public bool CaptionVisible
    {
        get { return _captionVisible; }
        set
        {
            if(_captionVisible != value)
            {
                _captionVisible = value;
                RaisePropertyChanged("CaptionVisible");
            }
        }
    }
}
于 2012-05-23T17:56:08.363 に答える
0

この問題の解決策を見つけました:

入れ子になったコントロールの依存関係プロパティをコンテナー コントロールの依存関係プロパティにリンクする必要がある場合は、次のようにします。

     public static readonly DependencyProperty captionLabelVisibilityProperty = DependencyProperty.Register(
                                                                                    "CaptionVisibility",
                                                                                    typeof(Visibility),
                                                                                    typeof(MyContainerControl),
                                                                                    new FrameworkPropertyMetadata(
                                                                                        VisibilityPropertyChangedCallback));

    public Visibility CaptionVisibility
    {
        get
        { return (Visibility)GetValue(captionLabelVisibilityProperty); }

        set
        { SetValue(captionLabelVisibilityProperty, value); }
    }

    private static void VisibilityPropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args)
    {
        MyContainerControl myContainerControlInstance = (MyContainerControl)controlInstance;
        myContainerControlInstance.myLabel.Visibility = (Visibility)args.NewValue;
    }
于 2012-05-24T19:07:29.627 に答える