C# 如何通过设置容器控件依赖属性来修改内部控件属性?
我正在WPF中创建一个控件,该控件包含一个标签,并且我创建了一个依赖项属性以修改标签的可见性属性 我的问题是,在指定依赖项属性的同时,找不到更改标签可见性属性的方法 我的代码如下:C# 如何通过设置容器控件依赖属性来修改内部控件属性?,c#,wpf,properties,wpf-controls,C#,Wpf,Properties,Wpf Controls,我正在WPF中创建一个控件,该控件包含一个标签,并且我创建了一个依赖项属性以修改标签的可见性属性 我的问题是,在指定依赖项属性的同时,找不到更改标签可见性属性的方法 我的代码如下: public static readonly DependencyProperty captionVisibleProperty = DependencyProperty.Register(
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
的内容
您还需要使用方便的dandyBooleanToVisiblityConverter
来进行绑定,因为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;
}