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()不应该。相反,只需将标签的Visibility属性绑定到您CaptionVisible在 xaml 中的属性。最好遵循Model-View-ViewModel设计模式来保持您的代码井井有条。这意味着将用于控制用户界面(视图)的逻辑放在单独的 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");
            }
        }
    }
}
于 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 回答