我想要一个WPF容器(面板、用户控件等),该容器公开一个属性,如果设置为只读,则所有子元素都变为只读。这基本上就像将父控件设置为IsEnabled=false,这也会禁用所有子元素。应考虑哪些子元素及其属性是固定的(例如TextBox.ReadOnly,DataGrid.ReadOnly等)。
我尝试创建这样的控件,它基本上遍历可视树的所有子元素(递归)并相应地处理控件。这很好用,但存在一种情况,即进一步更改会影响可视树,以便添加新的子元素。对于ContentControl或ItemsControl,这是正确的。如果在我完成此操作后向可视树添加了子元素,那么它们显然不是只读的。
我一直在寻找一个合适的事件来触发(基本上检测可视树中的新子元素),但无法找到合适的事件。UpdateLayout被触发,但太频繁了,每次都需要遍历可视树。
有解决方法吗?可能还有另一种方法可以通过父元素的绑定递归地将所有(相关的)子元素设置为只读吗?
(不:我不希望将所有子元素的只读属性绑定到全局绑定。关键是拥有单个元素/部分将此传播到所有子元素)
我尝试创建这样的控件,它基本上遍历可视树的所有子元素(递归)并相应地处理控件。这很好用,但存在一种情况,即进一步更改会影响可视树,以便添加新的子元素。对于ContentControl或ItemsControl,这是正确的。如果在我完成此操作后向可视树添加了子元素,那么它们显然不是只读的。
我一直在寻找一个合适的事件来触发(基本上检测可视树中的新子元素),但无法找到合适的事件。UpdateLayout被触发,但太频繁了,每次都需要遍历可视树。
有解决方法吗?可能还有另一种方法可以通过父元素的绑定递归地将所有(相关的)子元素设置为只读吗?
(不:我不希望将所有子元素的只读属性绑定到全局绑定。关键是拥有单个元素/部分将此传播到所有子元素)
NotifyPropertyChange(() => IsReadOnly);
),而不是尝试通过Visual Tree路由。 - Federico Berasategui