Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过设置容器控件依赖属性来修改内部控件属性?_C#_Wpf_Properties_Wpf Controls - Fatal编程技术网

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

C# 如何通过设置容器控件依赖属性来修改内部控件属性?,c#,wpf,properties,wpf-controls,C#,Wpf,Properties,Wpf Controls,我正在WPF中创建一个控件,该控件包含一个标签,并且我创建了一个依赖项属性以修改标签的可见性属性 我的问题是,在指定依赖项属性的同时,找不到更改标签可见性属性的方法 我的代码如下: public static readonly DependencyProperty captionVisibleProperty = DependencyProperty.Register(

我正在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()方法,但什么也没发生

那么,我该怎么做才能完成呢

希望有人能帮助我。提前感谢您。

ShowCaption()
应该没有必要。相反,只需将标签的
Visibility
属性绑定到xaml中的
CaptionVisible
属性。为了保持代码的条理化,最好遵循设计模式。这意味着将用于控制用户界面(视图)的逻辑放在单独的ViewModel类中,然后将ViewModel分配给该视图的
DataContext
属性

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

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

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


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

我找到了解决这个问题的方法:

如果需要将嵌套控件依赖项属性链接到容器控件依赖项属性,可以执行以下操作:

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

谢谢您的回复,@Sean U,但它对我不起作用,实际上我将属性的类型更改为Visibility,但它仍然不起作用绑定可能不太正确。在程序运行时,您是否看到输出窗口中出现任何错误?没有,没有,只是什么都没有发生。由于我将返回类型更改为“Visibility”,我将其写入xaml文件:Visibility=“{Binding CaptionVisibility}”,我也尝试了Visibility=“{Binding Path=CaptionVisibility}”,但这些都不起作用,CaptionVisibility属于哪个类?如果它仍然在控件中,那么您还需要指定在哪个控件中查找绑定。CaptionVisibility属性和标签属于同一个类,因为我正在尝试开发自己的控件
     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;
    }