这是情景:
我有一个包含一些TextBlock控件的网格(Grid),每个控件都在网格中单独的单元格中。逻辑上,我希望能够将它们的可见性(Viability)绑定到ViewModel中的属性。但是由于它们在网格中的单独单元格中,我必须设置每个TextBlock的可见性属性。
是否有一种非可视化组(Group)的方法,可以设置其子项的公共属性?或者说我是在做梦吗?
这是情景:
我有一个包含一些TextBlock控件的网格(Grid),每个控件都在网格中单独的单元格中。逻辑上,我希望能够将它们的可见性(Viability)绑定到ViewModel中的属性。但是由于它们在网格中的单独单元格中,我必须设置每个TextBlock的可见性属性。
是否有一种非可视化组(Group)的方法,可以设置其子项的公共属性?或者说我是在做梦吗?
没有任何非视觉组可以使这成为可能。
直接设置可见性属性,或者在所有TextBlocks共享的公共样式中设置,可能是最简单的解决方案。
另一个选项是将一组项目中每个项目的可见性属性绑定到一个单独的项目上,这样在你的代码后台中,你只需要设置一个项目的可见性。
在XAML中绑定Singleton属性,并从应用程序的任何地方控制此属性。
< TextBlock Visibility="{Binding Source={x:Static local:Singleton.Instance},Path=Visibility}"
并且可以实现一个简单的Singleton类
public class Singleton :INotifyPropertyChanged
{
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null){ instance = new Singleton(); }
return instance;
}
}
private Visibility _visibility;
public Visibility Visibility
{
get { return _visibility; }
set
{
_visibility = value;
PropertyChanged( this, new PropertyChangedEventArgs("Visibility") );
}
}
public event PropertyChangedEventHandler PropertyChanged;
private static Singleton instance;
}
现在,您可以从代码后台任何地方控制 Singleton.Instance.Visibility = Visibility.Collapsed
如果可能的话,我通常会将它们放入一个GroupBox中,并将GroupBox的BorderThickness设置为0。这样所有的控件都被分组在一起,你看不出来它是一个GroupBox,而且你可以使用一个属性来设置可见性。
<Style TargetType="{x:Type GroupBox}"
x:Key="HiddenGroupBox">
<Setter Property="BorderThickness"
Value="0" />
可能可以创建一个自定义控件来将其所有的添加/删除子元素方法重定向到它自己的父级,同时仍然保留其内容记录,以便可以应用自己的属性样式。不过这可能会有些麻烦。
我意识到这是一个非常古老的问题,但毫无疑问会有人在搜索相关内容后找到这个线程。因此,我提供以下非常简单的解决方案:
将所有相关控件放置在一个新的网格中,该网格位于现有网格内;跨越适当的单元格并在其自身结构中复制它们。然后,您可以更改新网格的可见性以及其中的控件。