我想要一个 WPF 容器(面板、用户控件等),它公开一个属性,以便将所有子项设置为只读(如果设置)。这应该与将父控件设置为 IsEnabled=false 非常相似,这也会禁用所有子控件。应考虑哪些子项及其哪些属性是固定的(例如 TextBox.ReadOnly、DataGrid.ReadOnly,...)。
我试图创建这样一个控件,它本质上迭代可视树的所有子级(递归地)并相应地处理控件。
这工作得很好,除非进一步的更改会影响视觉树,从而添加新的子项。对于 ContentControl 或 ItemsControl 来说也是如此。如果在我浏览完孩子之后将它们添加到视觉树中,那么它们显然不是只读的。
我一直试图找到一个好的事件来做出反应(基本上是在视觉树中检测新的孩子),但无法找到合适的东西。 UpdateLayout 被触发,但每次都会经常遍历可视化树。
有办法解决这个问题吗?是否有另一种方法可以通过父元素上的绑定将所有(相关)子元素递归设置为只读?
(不:我不想将所有子只读属性绑定到全局绑定。重点是有一个元素/部分将其传播到所有子元素)
您可以使用提供的附加属性来执行此操作价值传承 http://msdn.microsoft.com/en-us/library/ms753197.aspx:
public class ReadOnlyPanel
{
public static readonly DependencyProperty IsReadOnlyProperty =
DependencyProperty.RegisterAttached(
"IsReadOnly", typeof(bool), typeof(ReadOnlyPanel),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Inherits, ReadOnlyPropertyChanged));
public static bool GetIsReadOnly(DependencyObject o)
{
return (bool)o.GetValue(IsReadOnlyProperty);
}
public static void SetIsReadOnly(DependencyObject o, bool value)
{
o.SetValue(IsReadOnlyProperty, value);
}
private static void ReadOnlyPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
if (o is TextBox)
{
((TextBox)o).IsReadOnly = (bool)e.NewValue;
}
// other types here
}
}
您可以像这样在 XAML 中使用它:
<StackPanel local:ReadOnlyPanel.IsReadOnly="{Binding IsChecked, ElementName=cb}">
<CheckBox x:Name="cb" Content="ReadOnly"/>
<TextBox Text="Hello"/>
</StackPanel>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)