如何通过设置容器控件依赖属性来修改内部控件属性?

时间:2012-05-23 17:43:27

标签: c# wpf properties wpf-controls

我在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()方法,但没有任何反应。

那么,为了完成它我应该怎么做?

希望有人可以帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:1)

ShowCaption()不应该是必要的。相反,只需将标签的Visibility属性绑定到xaml中的CaptionVisible属性即可。最好遵循Model-View-ViewModel设计模式来保持代码的有序性。这意味着将用于控制用户界面(View)的逻辑放在单独的ViewModel类中,然后将ViewModel分配给该View的DataContext属性。

这将使绑定更容易。引用属于用户界面元素的属性有时在WPF中会有点麻烦。通过合同,WPF的绑定系统专门设计用于轻松获取用户界面元素DataContext的内容。

您还需要使用方便的花花公子BooleanToVisiblityConverter来使绑定工作,因为Visibility属性的类型不是bool。我喜欢将它放在窗口(或控件)的资源字典中以便于访问:

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

答案 1 :(得分: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;
    }